diff options
152 files changed, 11924 insertions, 8394 deletions
diff --git a/bootstrap/lib/kernel/ebin/code_server.beam b/bootstrap/lib/kernel/ebin/code_server.beam Binary files differindex 97123d4961..6f99487ca7 100644 --- a/bootstrap/lib/kernel/ebin/code_server.beam +++ b/bootstrap/lib/kernel/ebin/code_server.beam diff --git a/bootstrap/lib/kernel/ebin/dist_util.beam b/bootstrap/lib/kernel/ebin/dist_util.beam Binary files differindex 369871f398..eb09a06785 100644 --- a/bootstrap/lib/kernel/ebin/dist_util.beam +++ b/bootstrap/lib/kernel/ebin/dist_util.beam diff --git a/bootstrap/lib/kernel/ebin/rpc.beam b/bootstrap/lib/kernel/ebin/rpc.beam Binary files differindex 3b77ed641a..684d95afa0 100644 --- a/bootstrap/lib/kernel/ebin/rpc.beam +++ b/bootstrap/lib/kernel/ebin/rpc.beam diff --git a/bootstrap/lib/stdlib/ebin/epp.beam b/bootstrap/lib/stdlib/ebin/epp.beam Binary files differindex 5c98ffdafc..54909eeaa3 100644 --- a/bootstrap/lib/stdlib/ebin/epp.beam +++ b/bootstrap/lib/stdlib/ebin/epp.beam diff --git a/bootstrap/lib/stdlib/ebin/erl_lint.beam b/bootstrap/lib/stdlib/ebin/erl_lint.beam Binary files differindex 22d3607866..aeea1e2fcd 100644 --- a/bootstrap/lib/stdlib/ebin/erl_lint.beam +++ b/bootstrap/lib/stdlib/ebin/erl_lint.beam diff --git a/bootstrap/lib/stdlib/ebin/gen_statem.beam b/bootstrap/lib/stdlib/ebin/gen_statem.beam Binary files differindex 5be1739fd5..5a3fd2a1a5 100644 --- a/bootstrap/lib/stdlib/ebin/gen_statem.beam +++ b/bootstrap/lib/stdlib/ebin/gen_statem.beam diff --git a/erts/doc/src/absform.xml b/erts/doc/src/absform.xml index 6d6ba224a0..bfabb7f042 100644 --- a/erts/doc/src/absform.xml +++ b/erts/doc/src/absform.xml @@ -68,22 +68,12 @@ <item>If D is a module declaration consisting of the forms <c>F_1</c>, ..., <c>F_k</c>, then Rep(D) = <c>[Rep(F_1), ..., Rep(F_k)]</c>.</item> - <item>If F is an attribute <c>-behavior(Behavior)</c>, then - Rep(F) = <c>{attribute,LINE,behavior,Behavior}</c>.</item> - <item>If F is an attribute <c>-behaviour(Behaviour)</c>, then - Rep(F) = <c>{attribute,LINE,behaviour,Behaviour}</c>.</item> - <item>If F is an attribute <c>-compile(Options)</c>, then - Rep(F) = <c>{attribute,LINE,compile,Options}</c>.</item> <item>If F is an attribute <c>-export([Fun_1/A_1, ..., Fun_k/A_k])</c>, then Rep(F) = <c>{attribute,LINE,export,[{Fun_1,A_1}, ..., {Fun_k,A_k}]}</c>.</item> - <item>If F is an attribute <c>-export_type([Type_1/A_1, ..., Type_k/A_k])</c>, then - Rep(F) = <c>{attribute,LINE,export_type,[{Type_1,A_1}, ..., {Type_k,A_k}]}</c>.</item> <item>If F is an attribute <c>-import(Mod,[Fun_1/A_1, ..., Fun_k/A_k])</c>, then Rep(F) = <c>{attribute,LINE,import,{Mod,[{Fun_1,A_1}, ..., {Fun_k,A_k}]}}</c>.</item> <item>If F is an attribute <c>-module(Mod)</c>, then Rep(F) = <c>{attribute,LINE,module,Mod}</c>.</item> - <item>If F is an attribute <c>-optional_callbacks([Fun_1/A_1, ..., Fun_k/A_k])</c>, then - Rep(F) = <c>{attribute,LINE,optional_callbacks,[{Fun_1,A_1}, ..., {Fun_k,A_k}]}</c>.</item> <item>If F is an attribute <c>-file(File,Line)</c>, then Rep(F) = <c>{attribute,LINE,file,{File,Line}}</c>.</item> <item>If F is a function declaration diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c index 87508dcf5f..40d44dda4c 100644 --- a/erts/emulator/beam/beam_bif_load.c +++ b/erts/emulator/beam/beam_bif_load.c @@ -38,7 +38,7 @@ #include "erl_thr_progress.h" static void set_default_trace_pattern(Eterm module); -static Eterm check_process_code(Process* rp, Module* modp, Uint flags, int *redsp); +static Eterm check_process_code(Process* rp, Module* modp, Uint flags, int *redsp, int fcalls); static void delete_code(Module* modp); static void decrement_refc(BeamCodeHeader*); static int any_heap_ref_ptrs(Eterm* start, Eterm* end, char* mod_start, Uint mod_size); @@ -467,7 +467,7 @@ check_old_code_1(BIF_ALIST_1) } Eterm -erts_check_process_code(Process *c_p, Eterm module, Uint flags, int *redsp) +erts_check_process_code(Process *c_p, Eterm module, Uint flags, int *redsp, int fcalls) { Module* modp; Eterm res; @@ -483,7 +483,7 @@ erts_check_process_code(Process *c_p, Eterm module, Uint flags, int *redsp) return am_false; erts_rlock_old_code(code_ix); res = (!modp->old.code_hdr ? am_false : - check_process_code(c_p, modp, flags, redsp)); + check_process_code(c_p, modp, flags, redsp, fcalls)); erts_runlock_old_code(code_ix); return res; @@ -506,7 +506,7 @@ BIF_RETTYPE erts_internal_check_process_code_2(BIF_ALIST_2) goto badarg; } - res = erts_check_process_code(BIF_P, BIF_ARG_1, flags, &reds); + res = erts_check_process_code(BIF_P, BIF_ARG_1, flags, &reds, BIF_P->fcalls); ASSERT(is_value(res)); @@ -625,8 +625,8 @@ BIF_RETTYPE call_on_load_function_1(BIF_ALIST_1) { Module* modp = erts_get_module(BIF_ARG_1, erts_active_code_ix()); - if (modp && modp->curr.code_hdr) { - BIF_TRAP_CODE_PTR_0(BIF_P, modp->curr.code_hdr->on_load_function_ptr); + if (modp && modp->old.code_hdr) { + BIF_TRAP_CODE_PTR_0(BIF_P, modp->old.code_hdr->on_load_function_ptr); } else { BIF_ERROR(BIF_P, BADARG); @@ -651,14 +651,14 @@ BIF_RETTYPE finish_after_on_load_2(BIF_ALIST_2) code_ix = erts_active_code_ix(); modp = erts_get_module(BIF_ARG_1, code_ix); - if (!modp || !modp->curr.code_hdr) { + if (!modp || !modp->old.code_hdr) { error: erts_smp_thr_progress_unblock(); erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); erts_release_code_write_permission(); BIF_ERROR(BIF_P, BADARG); } - if (modp->curr.code_hdr->on_load_function_ptr == NULL) { + if (modp->old.code_hdr->on_load_function_ptr == NULL) { goto error; } if (BIF_ARG_2 != am_false && BIF_ARG_2 != am_true) { @@ -667,44 +667,55 @@ BIF_RETTYPE finish_after_on_load_2(BIF_ALIST_2) if (BIF_ARG_2 == am_true) { int i; + struct erl_module_instance t; + + /* + * Swap old and new code. + */ + t = modp->curr; + modp->curr = modp->old; + modp->old = t; /* * The on_load function succeded. Fix up export entries. */ for (i = 0; i < export_list_size(code_ix); i++) { Export *ep = export_list(i,code_ix); - if (ep != NULL && - ep->code[0] == BIF_ARG_1 && - ep->code[4] != 0) { + if (ep == NULL || ep->code[0] != BIF_ARG_1) { + continue; + } + if (ep->code[4] != 0) { ep->addressv[code_ix] = (void *) ep->code[4]; ep->code[4] = 0; + } else { + if (ep->addressv[code_ix] == ep->code+3 && + ep->code[3] == (BeamInstr) em_apply_bif) { + continue; + } + ep->addressv[code_ix] = ep->code+3; + ep->code[3] = (BeamInstr) em_call_error_handler; } } modp->curr.code_hdr->on_load_function_ptr = NULL; set_default_trace_pattern(BIF_ARG_1); } else if (BIF_ARG_2 == am_false) { - BeamInstr* code; - BeamInstr* end; + int i; /* - * The on_load function failed. Remove the loaded code. - * This is an combination of delete and purge. We purge - * the current code; the old code is not touched. + * The on_load function failed. Remove references to the + * code that is about to be purged from the export entries. */ - erts_total_code_size -= modp->curr.code_length; - code = (BeamInstr*) modp->curr.code_hdr; - end = (BeamInstr *) ((char *)code + modp->curr.code_length); - erts_cleanup_funs_on_purge(code, end); - beam_catches_delmod(modp->curr.catches, code, modp->curr.code_length, - erts_active_code_ix()); - if (modp->curr.code_hdr->literals_start) { - erts_free(ERTS_ALC_T_LITERAL, modp->curr.code_hdr->literals_start); - } - erts_free(ERTS_ALC_T_CODE, modp->curr.code_hdr); - modp->curr.code_hdr = NULL; - modp->curr.code_length = 0; - modp->curr.catches = BEAM_CATCHES_NIL; - erts_remove_from_ranges(code); + + for (i = 0; i < export_list_size(code_ix); i++) { + Export *ep = export_list(i,code_ix); + if (ep == NULL || ep->code[0] != BIF_ARG_1) { + continue; + } + if (ep->code[3] == (BeamInstr) em_apply_bif) { + continue; + } + ep->code[4] = 0; + } } erts_smp_thr_progress_unblock(); erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); @@ -753,7 +764,7 @@ check_mod_funs(Process *p, ErlOffHeap *off_heap, char *area, size_t area_size) static Eterm -check_process_code(Process* rp, Module* modp, Uint flags, int *redsp) +check_process_code(Process* rp, Module* modp, Uint flags, int *redsp, int fcalls) { BeamInstr* start; char* literals; @@ -955,7 +966,7 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp) if (need_gc & ERTS_ORDINARY_GC__) { FLAGS(rp) |= F_NEED_FULLSWEEP; - *redsp += erts_garbage_collect_nobump(rp, 0, rp->arg_reg, rp->arity); + *redsp += erts_garbage_collect_nobump(rp, 0, rp->arg_reg, rp->arity, fcalls); done_gc |= ERTS_ORDINARY_GC__; } if (need_gc & ERTS_LITERAL_GC__) { diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 72526bca5e..59112e1e43 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -308,7 +308,8 @@ void** beam_ops; if (E - HTOP < (needed + (HeapNeed))) { \ SWAPOUT; \ PROCESS_MAIN_CHK_LOCKS(c_p); \ - FCALLS -= erts_garbage_collect_nobump(c_p, needed + (HeapNeed), reg, (M)); \ + FCALLS -= erts_garbage_collect_nobump(c_p, needed + (HeapNeed), \ + reg, (M), FCALLS); \ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \ PROCESS_MAIN_CHK_LOCKS(c_p); \ SWAPIN; \ @@ -360,7 +361,7 @@ void** beam_ops; if ((E - HTOP < need) || (MSO(c_p).overhead + (VNh) >= BIN_VHEAP_SZ(c_p))) {\ SWAPOUT; \ PROCESS_MAIN_CHK_LOCKS(c_p); \ - FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, (Live)); \ + FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, (Live), FCALLS); \ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \ PROCESS_MAIN_CHK_LOCKS(c_p); \ SWAPIN; \ @@ -381,7 +382,7 @@ void** beam_ops; if (E - HTOP < need) { \ SWAPOUT; \ PROCESS_MAIN_CHK_LOCKS(c_p); \ - FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, (Live));\ + FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, (Live), FCALLS); \ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \ PROCESS_MAIN_CHK_LOCKS(c_p); \ SWAPIN; \ @@ -402,7 +403,7 @@ void** beam_ops; SWAPOUT; \ reg[Live] = Extra; \ PROCESS_MAIN_CHK_LOCKS(c_p); \ - FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, (Live)+1); \ + FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, (Live)+1, FCALLS); \ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \ PROCESS_MAIN_CHK_LOCKS(c_p); \ Extra = reg[Live]; \ @@ -1196,6 +1197,25 @@ init_emulator(void) #define DTRACE_NIF_RETURN(p, m, f, a) do {} while (0) #endif /* USE_VM_PROBES */ +#ifdef DEBUG +#define ERTS_DBG_CHK_REDS(P, FC) \ + do { \ + if (ERTS_PROC_GET_SAVED_CALLS_BUF((P))) { \ + ASSERT(FC <= 0); \ + ASSERT(ERTS_PROC_GET_SCHDATA(c_p)->virtual_reds \ + <= 0 - (FC)); \ + } \ + else { \ + ASSERT(FC <= CONTEXT_REDS); \ + ASSERT(ERTS_PROC_GET_SCHDATA(c_p)->virtual_reds \ + <= CONTEXT_REDS - (FC)); \ + } \ +} while (0) +#else +#define ERTS_DBG_CHK_REDS(P, FC) +#endif + + /* * process_main() is called twice: * The first call performs some initialisation, including exporting @@ -1290,7 +1310,12 @@ void process_main(void) goto do_schedule1; do_schedule: - reds_used = REDS_IN(c_p) - FCALLS; + ASSERT(c_p->debug_reds_in == REDS_IN(c_p)); + if (!ERTS_PROC_GET_SAVED_CALLS_BUF(c_p)) + reds_used = REDS_IN(c_p) - FCALLS; + else + reds_used = REDS_IN(c_p) - (CONTEXT_REDS + FCALLS); + ASSERT(reds_used >= 0); do_schedule1: if (start_time != 0) { @@ -1310,6 +1335,7 @@ void process_main(void) ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p); ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); c_p = schedule(c_p, reds_used); + ASSERT(!(c_p->flags & F_HIPE_MODE)); ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); start_time = 0; #ifdef DEBUG @@ -1348,16 +1374,21 @@ void process_main(void) SET_I(c_p->i); - reds = c_p->fcalls; - if (ERTS_PROC_GET_SAVED_CALLS_BUF(c_p) - && (ERTS_TRACE_FLAGS(c_p) & F_SENSITIVE) == 0) { - neg_o_reds = -reds; - FCALLS = REDS_IN(c_p) = 0; + REDS_IN(c_p) = reds = c_p->fcalls; +#ifdef DEBUG + c_p->debug_reds_in = reds; +#endif + + if (ERTS_PROC_GET_SAVED_CALLS_BUF(c_p)) { + neg_o_reds = -CONTEXT_REDS; + FCALLS = neg_o_reds + reds; } else { neg_o_reds = 0; - FCALLS = REDS_IN(c_p) = reds; + FCALLS = reds; } + ERTS_DBG_CHK_REDS(c_p, FCALLS); + next = (BeamInstr *) *I; SWAPIN; ASSERT(VALID_INSTR(next)); @@ -1770,7 +1801,7 @@ void process_main(void) if (E - HTOP < 3) { SWAPOUT; PROCESS_MAIN_CHK_LOCKS(c_p); - FCALLS -= erts_garbage_collect_nobump(c_p, 3, reg+2, 1); + FCALLS -= erts_garbage_collect_nobump(c_p, 3, reg+2, 1, FCALLS); ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); PROCESS_MAIN_CHK_LOCKS(c_p); SWAPIN; @@ -1865,6 +1896,7 @@ void process_main(void) c_p->flags |= F_DELAY_GC; loop_rec__: + PROCESS_MAIN_CHK_LOCKS(c_p); msgp = PEEK_MESSAGE(c_p); @@ -2007,6 +2039,8 @@ void process_main(void) ERTS_VBUMP_LEAVE_REDS_INTERNAL(c_p, 5, FCALLS); } + ERTS_DBG_CHK_REDS(c_p, FCALLS); + ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); PROCESS_MAIN_CHK_LOCKS(c_p); NextPF(0, next); @@ -2535,6 +2569,7 @@ do { \ GetArg1(2, tmp_reg[0]); bf = (BifFunction) Arg(1); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS; PROCESS_MAIN_CHK_LOCKS(c_p); ASSERT(!ERTS_PROC_IS_EXITING(c_p)); @@ -2544,6 +2579,7 @@ do { \ PROCESS_MAIN_CHK_LOCKS(c_p); ERTS_HOLE_CHECK(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(result)) { StoreBifResult(3, result); } @@ -2564,6 +2600,7 @@ do { \ GetArg1(1, tmp_reg[0]); bf = (BifFunction) Arg(0); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS; PROCESS_MAIN_CHK_LOCKS(c_p); ASSERT(!ERTS_PROC_IS_EXITING(c_p)); @@ -2573,6 +2610,7 @@ do { \ PROCESS_MAIN_CHK_LOCKS(c_p); ERTS_HOLE_CHECK(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(result)) { StoreBifResult(2, result); } @@ -2591,6 +2629,7 @@ do { \ GetArg1(2, x(live)); bf = (GcBifFunction) Arg(1); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS; SWAPOUT; PROCESS_MAIN_CHK_LOCKS(c_p); @@ -2602,6 +2641,7 @@ do { \ SWAPIN; ERTS_HOLE_CHECK(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(result)) { StoreBifResult(4, result); } @@ -2630,6 +2670,7 @@ do { \ */ live++; bf = (GcBifFunction) Arg(1); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS; SWAPOUT; PROCESS_MAIN_CHK_LOCKS(c_p); @@ -2641,6 +2682,7 @@ do { \ SWAPIN; ERTS_HOLE_CHECK(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(result)) { StoreBifResult(5, result); } @@ -2671,6 +2713,7 @@ do { \ */ live += 2; bf = (GcBifFunction) Arg(1); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS; SWAPOUT; PROCESS_MAIN_CHK_LOCKS(c_p); @@ -2682,6 +2725,7 @@ do { \ SWAPIN; ERTS_HOLE_CHECK(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(result)) { StoreBifResult(5, result); } @@ -2708,6 +2752,7 @@ do { \ GetArg2(2, tmp_reg[0], tmp_reg[1]); bf = (BifFunction) Arg(1); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS; PROCESS_MAIN_CHK_LOCKS(c_p); ASSERT(!ERTS_PROC_IS_EXITING(c_p)); @@ -2717,6 +2762,7 @@ do { \ PROCESS_MAIN_CHK_LOCKS(c_p); ERTS_HOLE_CHECK(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(result)) { StoreBifResult(4, result); } @@ -2775,6 +2821,7 @@ do { \ bf = GET_BIF_ADDRESS(Arg(0)); PRE_BIF_SWAPOUT(c_p); + ERTS_DBG_CHK_REDS(c_p, FCALLS); c_p->fcalls = FCALLS - 1; if (FCALLS <= 0) { save_calls(c_p, (Export *) Arg(0)); @@ -2796,6 +2843,7 @@ do { \ PROCESS_MAIN_CHK_LOCKS(c_p); HTOP = HEAP_TOP(c_p); FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); /* We have to update the cache if we are enabled in order to make sure no book keeping is done after we disabled msacc. We don't always do this as it is quite expensive. */ @@ -3324,8 +3372,13 @@ do { \ * (beacuse the code for the Dispatch() macro becomes shorter that way). */ - reds_used = REDS_IN(c_p) - FCALLS + 1; - + ASSERT(c_p->debug_reds_in == REDS_IN(c_p)); + if (!ERTS_PROC_GET_SAVED_CALLS_BUF(c_p)) + reds_used = REDS_IN(c_p) - FCALLS; + else + reds_used = REDS_IN(c_p) - (CONTEXT_REDS + FCALLS); + ASSERT(reds_used >= 0); + /* * Save the argument registers and everything else. */ @@ -3514,6 +3567,7 @@ do { \ DTRACE_BIF_ENTRY(c_p, (Eterm)I[-3], (Eterm)I[-2], (Uint)I[-1]); SWAPOUT; + ERTS_DBG_CHK_REDS(c_p, FCALLS - 1); c_p->fcalls = FCALLS - 1; vbf = (BifFunction) Arg(0); PROCESS_MAIN_CHK_LOCKS(c_p); @@ -3549,6 +3603,7 @@ do { \ } SWAPIN; /* There might have been a garbage collection. */ FCALLS = c_p->fcalls; + ERTS_DBG_CHK_REDS(c_p, FCALLS); if (is_value(nif_bif_result)) { r(0) = nif_bif_result; CHECK_TERM(r(0)); @@ -4611,9 +4666,9 @@ do { \ OpCase(i_generic_breakpoint): { BeamInstr real_I; ASSERT(I[-5] == (BeamInstr) BeamOp(op_i_func_info_IaaI)); - SWAPOUT; + HEAVY_SWAPOUT; real_I = erts_generic_breakpoint(c_p, I, reg); - SWAPIN; + HEAVY_SWAPIN; ASSERT(VALID_INSTR(real_I)); Goto(real_I); } @@ -4790,6 +4845,7 @@ do { \ { #define HIPE_MODE_SWITCH(Cmd) \ SWAPOUT; \ + ERTS_DBG_CHK_REDS(c_p, FCALLS); \ c_p->fcalls = FCALLS; \ c_p->def_arg_reg[4] = -neg_o_reds; \ c_p = hipe_mode_switch(c_p, Cmd, reg); \ @@ -4828,6 +4884,9 @@ do { \ #undef HIPE_MODE_SWITCH L_post_hipe_mode_switch: +#ifdef DEBUG + pid = c_p->common.id; /* may have switched process... */ +#endif reg = ERTS_PROC_GET_SCHDATA(c_p)->x_reg_array; freg = ERTS_PROC_GET_SCHDATA(c_p)->f_reg_array; ERL_BITS_RELOAD_STATEP(c_p); @@ -4835,6 +4894,7 @@ do { \ neg_o_reds = -c_p->def_arg_reg[4]; FCALLS = c_p->fcalls; SWAPIN; + ERTS_DBG_CHK_REDS(c_p, FCALLS); switch( c_p->def_arg_reg[3] ) { case HIPE_MODE_SWITCH_RES_RETURN: ASSERT(is_value(reg[0])); @@ -6839,7 +6899,7 @@ erts_current_reductions(Process *current, Process *p) if (current != p) { return 0; } else if (current->fcalls < 0 && ERTS_PROC_GET_SAVED_CALLS_BUF(current)) { - return -current->fcalls; + return current->fcalls + CONTEXT_REDS; } else { return REDS_IN(current) - current->fcalls; } diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index 2e21a553ed..95489d9a63 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -32,6 +32,7 @@ #include "bif.h" #include "external.h" #include "beam_load.h" +#include "beam_bp.h" #include "big.h" #include "erl_bits.h" #include "beam_catches.h" @@ -479,9 +480,9 @@ static void free_loader_state(Binary* magic); static ErlHeapFragment* new_literal_fragment(Uint size); static void free_literal_fragment(ErlHeapFragment*); static void loader_state_dtor(Binary* magic); -static Eterm insert_new_code(Process *c_p, ErtsProcLocks c_p_locks, - Eterm group_leader, Eterm module, - BeamCodeHeader* code, Uint size); +static Eterm stub_insert_new_code(Process *c_p, ErtsProcLocks c_p_locks, + Eterm group_leader, Eterm module, + BeamCodeHeader* code, Uint size); static int init_iff_file(LoaderState* stp, byte* code, Uint size); static int scan_iff_file(LoaderState* stp, Uint* chunk_types, Uint num_types, Uint num_mandatory); @@ -513,7 +514,7 @@ static GenOp* gen_get_map_element(LoaderState* stp, GenOpArg Fail, GenOpArg Src, static int freeze_code(LoaderState* stp); -static void final_touch(LoaderState* stp); +static void final_touch(LoaderState* stp, struct erl_module_instance* inst_p); static void short_file(int line, LoaderState* stp, unsigned needed); static void load_printf(int line, LoaderState* context, char *fmt, ...); static int transform_engine(LoaderState* st); @@ -766,8 +767,11 @@ Eterm erts_finish_loading(Binary* magic, Process* c_p, ErtsProcLocks c_p_locks, Eterm* modp) { - Eterm retval; + Eterm retval = NIL; LoaderState* stp = ERTS_MAGIC_BIN_DATA(magic); + Module* mod_tab_p; + struct erl_module_instance* inst_p; + Uint size; /* * No other process may run since we will update the export @@ -776,27 +780,80 @@ erts_finish_loading(Binary* magic, Process* c_p, ERTS_SMP_LC_ASSERT(erts_initialized == 0 || erts_has_code_write_permission() || erts_smp_thr_progress_is_blocking()); - /* * Make current code for the module old and insert the new code * as current. This will fail if there already exists old code * for the module. */ + mod_tab_p = erts_put_module(stp->module); CHKBLK(ERTS_ALC_T_CODE,stp->code); - retval = insert_new_code(c_p, c_p_locks, stp->group_leader, stp->module, - stp->hdr, stp->loaded_size); - if (retval != NIL) { - goto load_error; + if (!stp->on_load) { + /* + * Normal case -- no -on_load() function. + */ + retval = beam_make_current_old(c_p, c_p_locks, stp->module); + ASSERT(retval == NIL); + } else { + ErtsCodeIndex code_ix = erts_staging_code_ix(); + Eterm module = stp->module; + int i; + + /* + * There is an -on_load() function. We will keep the current + * code, but we must turn off any tracing. + */ + + for (i = 0; i < export_list_size(code_ix); i++) { + Export *ep = export_list(i, code_ix); + if (ep == NULL || ep->code[0] != module) { + continue; + } + if (ep->addressv[code_ix] == ep->code+3) { + if (ep->code[3] == (BeamInstr) em_apply_bif) { + continue; + } else if (ep->code[3] == + (BeamInstr) BeamOp(op_i_generic_breakpoint)) { + ERTS_SMP_LC_ASSERT(erts_smp_thr_progress_is_blocking()); + ASSERT(mod_tab_p->curr.num_traced_exports > 0); + erts_clear_export_break(mod_tab_p, ep->code+3); + ep->addressv[code_ix] = (BeamInstr *) ep->code[4]; + ep->code[4] = 0; + } + ASSERT(ep->code[4] == 0); + } + } + ASSERT(mod_tab_p->curr.num_breakpoints == 0); + ASSERT(mod_tab_p->curr.num_traced_exports == 0); } /* + * Update module table. + */ + + size = stp->loaded_size; + erts_total_code_size += size; + if (stp->on_load) { + inst_p = &mod_tab_p->old; + } else { + inst_p = &mod_tab_p->curr; + } + inst_p->code_hdr = stp->hdr; + inst_p->code_length = size; + + /* + * Update ranges (used for finding a function from a PC value). + */ + + erts_update_ranges((BeamInstr*)inst_p->code_hdr, size); + + /* * Ready for the final touch: fixing the export table entries for * exported and imported functions. This can't fail. */ CHKBLK(ERTS_ALC_T_CODE,stp->code); - final_touch(stp); + final_touch(stp, inst_p); /* * Loading succeded. @@ -820,7 +877,6 @@ erts_finish_loading(Binary* magic, Process* c_p, retval = am_on_load; } - load_error: free_loader_state(magic); return retval; } @@ -1026,9 +1082,9 @@ loader_state_dtor(Binary* magic) } static Eterm -insert_new_code(Process *c_p, ErtsProcLocks c_p_locks, - Eterm group_leader, Eterm module, BeamCodeHeader* code_hdr, - Uint size) +stub_insert_new_code(Process *c_p, ErtsProcLocks c_p_locks, + Eterm group_leader, Eterm module, + BeamCodeHeader* code_hdr, Uint size) { Module* modp; Eterm retval; @@ -4700,14 +4756,13 @@ freeze_code(LoaderState* stp) } static void -final_touch(LoaderState* stp) +final_touch(LoaderState* stp, struct erl_module_instance* inst_p) { int i; int on_load = stp->on_load; unsigned catches; Uint index; BeamInstr* codev = stp->codev; - Module* modp; /* * Allocate catch indices and fix up all catch_yf instructions. @@ -4722,8 +4777,7 @@ final_touch(LoaderState* stp) codev[index+2] = make_catch(catches); index = next; } - modp = erts_put_module(stp->module); - modp->curr.catches = catches; + inst_p->catches = catches; /* * Export functions. @@ -4743,10 +4797,10 @@ final_touch(LoaderState* stp) ep->addressv[erts_staging_code_ix()] = address; } else { /* - * Don't make any of the exported functions - * callable yet. + * on_load: Don't make any of the exported functions + * callable yet. Keep any function in the current + * code callable. */ - ep->addressv[erts_staging_code_ix()] = ep->code+3; ep->code[4] = (BeamInstr) address; } } @@ -6421,7 +6475,8 @@ erts_make_stub_module(Process* p, Eterm Mod, Eterm Beam, Eterm Info) * Insert the module in the module table. */ - rval = insert_new_code(p, 0, p->group_leader, Mod, code_hdr, code_size); + rval = stub_insert_new_code(p, 0, p->group_leader, Mod, + code_hdr, code_size); if (rval != NIL) { goto error; } diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index c38d031ab8..9d6dfefa3c 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -1569,7 +1569,32 @@ static BIF_RETTYPE process_flag_aux(Process *BIF_P, scb->n = 0; } - scb = ERTS_PROC_SET_SAVED_CALLS_BUF(rp, scb); +#ifdef HIPE + if (rp->flags & F_HIPE_MODE) { + ASSERT(!ERTS_PROC_GET_SAVED_CALLS_BUF(rp)); + scb = ERTS_PROC_SET_SUSPENDED_SAVED_CALLS_BUF(rp, scb); + } + else +#endif + { +#ifdef HIPE + ASSERT(!ERTS_PROC_GET_SUSPENDED_SAVED_CALLS_BUF(rp)); +#endif + scb = ERTS_PROC_SET_SAVED_CALLS_BUF(rp, scb); + if (rp == BIF_P && ((scb && i == 0) || (!scb && i != 0))) { + /* Adjust fcalls to match save calls setting... */ + if (i == 0) + BIF_P->fcalls += CONTEXT_REDS; /* disabled it */ + else + BIF_P->fcalls -= CONTEXT_REDS; /* enabled it */ + + /* + * Make sure we reschedule immediately so the + * change take effect at once. + */ + ERTS_VBUMP_ALL_REDS(BIF_P); + } + } if (!scb) old_value = make_small(0); @@ -1578,12 +1603,7 @@ static BIF_RETTYPE process_flag_aux(Process *BIF_P, erts_free(ERTS_ALC_T_CALLS_BUF, (void *) scb); } - /* Make sure the process in question is rescheduled - immediately, if it's us, so the call saving takes effect. */ - if (rp == BIF_P) - BIF_RET2(old_value, CONTEXT_REDS); - else - BIF_RET(old_value); + BIF_RET(old_value); } error: @@ -1777,10 +1797,18 @@ BIF_RETTYPE process_flag_3(BIF_ALIST_3) Process *rp; Eterm res; - if ((rp = erts_pid2proc(BIF_P, ERTS_PROC_LOCK_MAIN, - BIF_ARG_1, ERTS_PROC_LOCK_MAIN)) == NULL) { +#ifdef ERTS_SMP + rp = erts_pid2proc_not_running(BIF_P, ERTS_PROC_LOCK_MAIN, + BIF_ARG_1, ERTS_PROC_LOCK_MAIN); + if (rp == ERTS_PROC_LOCK_BUSY) + ERTS_BIF_YIELD3(bif_export[BIF_process_flag_3], BIF_P, + BIF_ARG_1, BIF_ARG_2, BIF_ARG_3); +#else + rp = erts_proc_lookup(BIF_ARG_1); +#endif + + if (!rp) BIF_ERROR(BIF_P, BADARG); - } res = process_flag_aux(BIF_P, rp, BIF_ARG_2, BIF_ARG_3); diff --git a/erts/emulator/beam/bif.h b/erts/emulator/beam/bif.h index 546e3830b9..5d751dd67d 100644 --- a/erts/emulator/beam/bif.h +++ b/erts/emulator/beam/bif.h @@ -52,6 +52,7 @@ extern Export *erts_convert_time_unit_trap; (p)->fcalls = 0; \ else \ (p)->fcalls = -CONTEXT_REDS; \ + ASSERT(ERTS_BIF_REDS_LEFT((p)) == 0); \ } while(0) #define ERTS_VBUMP_ALL_REDS_INTERNAL(p, fcalls) \ diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index 52fd57e101..277e0668a2 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -1967,7 +1967,7 @@ dist_port_command(Port *prt, ErtsDistOutputBuf *obuf) ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt)); if (size > (Uint) INT_MAX) - erts_exit(ERTS_ABORT_EXIT, + erts_exit(ERTS_DUMP_EXIT, "Absurdly large distribution output data buffer " "(%beu bytes) passed.\n", size); @@ -2007,7 +2007,7 @@ dist_port_commandv(Port *prt, ErtsDistOutputBuf *obuf) ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt)); if (size > (Uint) INT_MAX) - erts_exit(ERTS_ABORT_EXIT, + erts_exit(ERTS_DUMP_EXIT, "Absurdly large distribution output data buffer " "(%beu bytes) passed.\n", size); diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index cf54f1e384..e21fba6bf1 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -116,7 +116,7 @@ static Eterm *full_sweep_heaps(Process *p, char *oh, Uint oh_size, Eterm *objv, int nobj); static int garbage_collect(Process* p, ErlHeapFragment *live_hf_end, - int need, Eterm* objv, int nobj); + int need, Eterm* objv, int nobj, int fcalls); static int major_collection(Process* p, ErlHeapFragment *live_hf_end, int need, Eterm* objv, int nobj, Uint *recl); static int minor_collection(Process* p, ErlHeapFragment *live_hf_end, @@ -392,15 +392,15 @@ erts_gc_after_bif_call_lhf(Process* p, ErlHeapFragment *live_hf_end, regs = ERTS_PROC_GET_SCHDATA(p)->x_reg_array; } #endif - cost = garbage_collect(p, live_hf_end, 0, regs, p->arity); + cost = garbage_collect(p, live_hf_end, 0, regs, p->arity, p->fcalls); } else { - cost = garbage_collect(p, live_hf_end, 0, regs, arity); + cost = garbage_collect(p, live_hf_end, 0, regs, arity, p->fcalls); } } else { Eterm val[1]; val[0] = result; - cost = garbage_collect(p, live_hf_end, 0, val, 1); + cost = garbage_collect(p, live_hf_end, 0, val, 1, p->fcalls); result = val[0]; } BUMP_REDS(p, cost); @@ -431,7 +431,7 @@ static ERTS_INLINE void reset_active_writer(Process *p) #define ERTS_ABANDON_HEAP_COST 10 static int -delay_garbage_collection(Process *p, ErlHeapFragment *live_hf_end, int need) +delay_garbage_collection(Process *p, ErlHeapFragment *live_hf_end, int need, int fcalls) { ErlHeapFragment *hfrag; Eterm *orig_heap, *orig_hend, *orig_htop, *orig_stop; @@ -506,12 +506,16 @@ delay_garbage_collection(Process *p, ErlHeapFragment *live_hf_end, int need) /* Make sure that we do a proper GC as soon as possible... */ p->flags |= F_FORCE_GC; - reds_left = ERTS_BIF_REDS_LEFT(p); + reds_left = ERTS_REDS_LEFT(p, fcalls); + ASSERT(CONTEXT_REDS - reds_left >= ERTS_PROC_GET_SCHDATA(p)->virtual_reds); + if (reds_left > ERTS_ABANDON_HEAP_COST) { int vreds = reds_left - ERTS_ABANDON_HEAP_COST; - ERTS_VBUMP_REDS(p, vreds); + ERTS_PROC_GET_SCHDATA((p))->virtual_reds += vreds; } - return ERTS_ABANDON_HEAP_COST; + + ASSERT(CONTEXT_REDS >= ERTS_PROC_GET_SCHDATA(p)->virtual_reds); + return reds_left; } static ERTS_FORCE_INLINE Uint @@ -570,7 +574,7 @@ young_gen_usage(Process *p) */ static int garbage_collect(Process* p, ErlHeapFragment *live_hf_end, - int need, Eterm* objv, int nobj) + int need, Eterm* objv, int nobj, int fcalls) { Uint reclaimed_now = 0; int reds; @@ -581,8 +585,11 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); #endif + ASSERT(CONTEXT_REDS - ERTS_REDS_LEFT(p, fcalls) + >= ERTS_PROC_GET_SCHDATA(p)->virtual_reds); + if (p->flags & (F_DISABLE_GC|F_DELAY_GC)) - return delay_garbage_collection(p, live_hf_end, need); + return delay_garbage_collection(p, live_hf_end, need, fcalls); if (p->abandoned_heap) live_hf_end = ERTS_INVALID_HFRAG_PTR; @@ -703,16 +710,23 @@ do_major_collection: } int -erts_garbage_collect_nobump(Process* p, int need, Eterm* objv, int nobj) +erts_garbage_collect_nobump(Process* p, int need, Eterm* objv, int nobj, int fcalls) { - return garbage_collect(p, ERTS_INVALID_HFRAG_PTR, need, objv, nobj); + int reds = garbage_collect(p, ERTS_INVALID_HFRAG_PTR, need, objv, nobj, fcalls); + int reds_left = ERTS_REDS_LEFT(p, fcalls); + if (reds > reds_left) + reds = reds_left; + ASSERT(CONTEXT_REDS - (reds_left - reds) >= ERTS_PROC_GET_SCHDATA(p)->virtual_reds); + return reds; } void erts_garbage_collect(Process* p, int need, Eterm* objv, int nobj) { - int reds = garbage_collect(p, ERTS_INVALID_HFRAG_PTR, need, objv, nobj); + int reds = garbage_collect(p, ERTS_INVALID_HFRAG_PTR, need, objv, nobj, p->fcalls); BUMP_REDS(p, reds); + ASSERT(CONTEXT_REDS - ERTS_BIF_REDS_LEFT(p) + >= ERTS_PROC_GET_SCHDATA(p)->virtual_reds); } /* diff --git a/erts/emulator/beam/erl_gc.h b/erts/emulator/beam/erl_gc.h index 40b7c5d12c..8a6ff99990 100644 --- a/erts/emulator/beam/erl_gc.h +++ b/erts/emulator/beam/erl_gc.h @@ -139,7 +139,7 @@ Eterm erts_process_gc_info(struct process*, Uint *, Eterm **); void erts_gc_info(ErtsGCInfo *gcip); void erts_init_gc(void); -int erts_garbage_collect_nobump(struct process*, int, Eterm*, int); +int erts_garbage_collect_nobump(struct process*, int, Eterm*, int, int); void erts_garbage_collect(struct process*, int, Eterm*, int); void erts_garbage_collect_hibernate(struct process* p); Eterm erts_gc_after_bif_call_lhf(struct process* p, ErlHeapFragment *live_hf_end, diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 2fd1eeb785..fcd2739ac3 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -206,15 +206,15 @@ int erts_no_line_info = 0; /* -L: Don't load line information */ ErtsModifiedTimings erts_modified_timings[] = { /* 0 */ {make_small(0), CONTEXT_REDS, INPUT_REDUCTIONS}, - /* 1 */ {make_small(0), 2*CONTEXT_REDS, 2*INPUT_REDUCTIONS}, + /* 1 */ {make_small(0), (3*CONTEXT_REDS)/4, 2*INPUT_REDUCTIONS}, /* 2 */ {make_small(0), CONTEXT_REDS/2, INPUT_REDUCTIONS/2}, - /* 3 */ {make_small(0), 3*CONTEXT_REDS, 3*INPUT_REDUCTIONS}, + /* 3 */ {make_small(0), (7*CONTEXT_REDS)/8, 3*INPUT_REDUCTIONS}, /* 4 */ {make_small(0), CONTEXT_REDS/3, 3*INPUT_REDUCTIONS}, - /* 5 */ {make_small(0), 4*CONTEXT_REDS, INPUT_REDUCTIONS/2}, + /* 5 */ {make_small(0), (10*CONTEXT_REDS)/11, INPUT_REDUCTIONS/2}, /* 6 */ {make_small(1), CONTEXT_REDS/4, 2*INPUT_REDUCTIONS}, - /* 7 */ {make_small(1), 5*CONTEXT_REDS, INPUT_REDUCTIONS/3}, + /* 7 */ {make_small(1), (5*CONTEXT_REDS)/7, INPUT_REDUCTIONS/3}, /* 8 */ {make_small(10), CONTEXT_REDS/5, 3*INPUT_REDUCTIONS}, - /* 9 */ {make_small(10), 6*CONTEXT_REDS, INPUT_REDUCTIONS/4} + /* 9 */ {make_small(10), (6*CONTEXT_REDS)/7, INPUT_REDUCTIONS/4} }; #define ERTS_MODIFIED_TIMING_LEVELS \ diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index 941f44b9ec..dc83a780a2 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -2780,7 +2780,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) ErlNifEntry* entry = NULL; ErlNifEnv env; int i, err, encoding; - Module* mod; + Module* module_p; Eterm mod_atom; const Atom* mod_atomp; Eterm f_atom; @@ -2790,6 +2790,8 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) int veto; struct erl_module_nif* lib = NULL; int reload_warning = 0; + struct erl_module_instance* this_mi; + struct erl_module_instance* prev_mi; encoding = erts_get_native_filename_encoding(); if (encoding == ERL_FILENAME_WIN_WCHAR) { @@ -2823,21 +2825,29 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) ASSERT(caller != NULL); mod_atom = caller[0]; ASSERT(is_atom(mod_atom)); - mod=erts_get_module(mod_atom, erts_active_code_ix()); - ASSERT(mod != NULL); + module_p = erts_get_module(mod_atom, erts_active_code_ix()); + ASSERT(module_p != NULL); mod_atomp = atom_tab(atom_val(mod_atom)); init_func = erts_static_nif_get_nif_init((char*)mod_atomp->name, mod_atomp->len); if (init_func != NULL) handle = init_func; - if (!in_area(caller, mod->curr.code_hdr, mod->curr.code_length)) { - ASSERT(in_area(caller, mod->old.code_hdr, mod->old.code_length)); + if (in_area(caller, module_p->old.code_hdr, module_p->old.code_length)) { + if (module_p->old.code_hdr->on_load_function_ptr) { + this_mi = &module_p->old; + prev_mi = &module_p->curr; + } else { + ret = load_nif_error(BIF_P, "old_code", "Calling load_nif from old " + "module '%T' not allowed", mod_atom); + goto error; + } + } else { + this_mi = &module_p->curr; + prev_mi = &module_p->old; + } - ret = load_nif_error(BIF_P, "old_code", "Calling load_nif from old " - "module '%T' not allowed", mod_atom); - } - else if (init_func == NULL && + if (init_func == NULL && (err=erts_sys_ddll_open(lib_name, &handle, &errdesc)) != ERL_DE_NO_ERROR) { const char slogan[] = "Failed to load NIF library"; if (strstr(errdesc.str, lib_name) != NULL) { @@ -2886,7 +2896,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) for (i=0; i < entry->num_of_funcs && ret==am_ok; i++) { BeamInstr** code_pp; if (!erts_atom_get(f->name, sys_strlen(f->name), &f_atom, ERTS_ATOM_ENC_LATIN1) - || (code_pp = get_func_pp(mod->curr.code_hdr, f_atom, f->arity))==NULL) { + || (code_pp = get_func_pp(this_mi->code_hdr, f_atom, f->arity))==NULL) { ret = load_nif_error(BIF_P,bad_lib,"Function not found %T:%s/%u", mod_atom, f->name, f->arity); } @@ -2937,9 +2947,9 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) erts_refc_init(&lib->rt_cnt, 0); erts_refc_init(&lib->rt_dtor_cnt, 0); ASSERT(opened_rt_list == NULL); - lib->mod = mod; + lib->mod = module_p; env.mod_nif = lib; - if (mod->curr.nif != NULL) { /*************** Reload ******************/ + if (this_mi->nif != NULL) { /*************** Reload ******************/ /* * Repeated load_nif calls from same Erlang module instance ("reload") * is deprecated and was only ment as a development feature not to @@ -2947,16 +2957,16 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) */ int k, old_incr = 0; ErlNifFunc* old_func; - lib->priv_data = mod->curr.nif->priv_data; + lib->priv_data = this_mi->nif->priv_data; - ASSERT(mod->curr.nif->entry != NULL); + ASSERT(this_mi->nif->entry != NULL); if (entry->reload == NULL) { ret = load_nif_error(BIF_P,reload,"Reload not supported by this NIF library."); goto error; } /* Check that no NIF is removed */ - old_func = mod->curr.nif->entry->funcs; - for (k=0; k < mod->curr.nif->entry->num_of_funcs; k++) { + old_func = this_mi->nif->entry->funcs; + for (k=0; k < this_mi->nif->entry->num_of_funcs; k++) { int incr = 0; ErlNifFunc* f = entry->funcs; for (i=0; i < entry->num_of_funcs; i++) { @@ -2972,7 +2982,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) old_func->name, old_func->arity); goto error; } - old_func = next_func(mod->curr.nif->entry, &old_incr, old_func); + old_func = next_func(this_mi->nif->entry, &old_incr, old_func); } erts_pre_nif(&env, BIF_P, lib, NULL); veto = entry->reload(&env, &lib->priv_data, BIF_ARG_2); @@ -2982,24 +2992,24 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) } else { commit_opened_resource_types(lib); - mod->curr.nif->entry = NULL; /* to prevent 'unload' callback */ - erts_unload_nif(mod->curr.nif); + this_mi->nif->entry = NULL; /* to prevent 'unload' callback */ + erts_unload_nif(this_mi->nif); reload_warning = 1; } } else { lib->priv_data = NULL; - if (mod->old.nif != NULL) { /**************** Upgrade ***************/ - void* prev_old_data = mod->old.nif->priv_data; + if (prev_mi->nif != NULL) { /**************** Upgrade ***************/ + void* prev_old_data = prev_mi->nif->priv_data; if (entry->upgrade == NULL) { ret = load_nif_error(BIF_P, upgrade, "Upgrade not supported by this NIF library."); goto error; } - erts_pre_nif(&env, BIF_P, lib, NULL); - veto = entry->upgrade(&env, &lib->priv_data, &mod->old.nif->priv_data, BIF_ARG_2); + erts_pre_nif(&env, BIF_P, lib, NULL); + veto = entry->upgrade(&env, &lib->priv_data, &prev_mi->nif->priv_data, BIF_ARG_2); erts_post_nif(&env); if (veto) { - mod->old.nif->priv_data = prev_old_data; + prev_mi->nif->priv_data = prev_old_data; ret = load_nif_error(BIF_P, upgrade, "Library upgrade-call unsuccessful."); } else @@ -3024,12 +3034,12 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) int incr = 0; ErlNifFunc* f = entry->funcs; - mod->curr.nif = lib; + this_mi->nif = lib; for (i=0; i < entry->num_of_funcs; i++) { BeamInstr* code_ptr; erts_atom_get(f->name, sys_strlen(f->name), &f_atom, ERTS_ATOM_ENC_LATIN1); - code_ptr = *get_func_pp(mod->curr.code_hdr, f_atom, f->arity); + code_ptr = *get_func_pp(this_mi->code_hdr, f_atom, f->arity); if (code_ptr[1] == 0) { code_ptr[5+0] = (BeamInstr) BeamOp(op_call_nif); diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index d485affa3b..bc32f3f167 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -6688,10 +6688,8 @@ schedule_process_sys_task(Process *p, erts_aint32_t prio, ErtsProcSysTask *st) erts_aint32_t e; n = e = a; - if (a & ERTS_PSFLG_FREE) { - res = 0; + if (a & ERTS_PSFLG_FREE) goto cleanup; /* We don't want to schedule free processes... */ - } enqueue = ERTS_ENQUEUE_NOT; n |= ERTS_PSFLG_ACTIVE_SYS; @@ -9240,6 +9238,21 @@ erts_set_process_priority(Process *p, Eterm value) } } +static int +scheduler_gc_proc(Process *c_p, int reds_left) +{ + int fcalls, reds; + if (!ERTS_PROC_GET_SAVED_CALLS_BUF(c_p)) + fcalls = reds_left; + else + fcalls = reds_left - CONTEXT_REDS; + reds = erts_garbage_collect_nobump(c_p, 0, c_p->arg_reg, c_p->arity, fcalls); + ASSERT(reds_left >= reds); + return reds; +} + + + /* * schedule() is called from BEAM (process_main()) or HiPE * (hipe_mode_switch()) when the current process is to be @@ -9318,6 +9331,7 @@ Process *schedule(Process *p, int calls) #endif reds = actual_reds = calls - esdp->virtual_reds; + ASSERT(actual_reds >= 0); if (reds < ERTS_PROC_MIN_CONTEXT_SWITCH_REDS_COST) reds = ERTS_PROC_MIN_CONTEXT_SWITCH_REDS_COST; esdp->virtual_reds = 0; @@ -9740,7 +9754,7 @@ Process *schedule(Process *p, int calls) esdp->current_process = p; - + calls = 0; reds = context_reds; #ifdef ERTS_SMP @@ -9819,9 +9833,7 @@ Process *schedule(Process *p, int calls) /* Migrate to dirty scheduler... */ sunlock_sched_out_proc: erts_smp_proc_unlock(p, ERTS_PROC_LOCK_STATUS); - p->fcalls = reds; goto sched_out_proc; - } } else { @@ -9856,8 +9868,6 @@ Process *schedule(Process *p, int calls) #endif /* ERTS_SMP */ - p->fcalls = reds; - erts_smp_proc_unlock(p, ERTS_PROC_LOCK_STATUS); if (IS_TRACED(p)) { @@ -9890,14 +9900,15 @@ Process *schedule(Process *p, int calls) * not allowed to execute system tasks. */ if (!(p->flags & F_DELAY_GC)) { - reds -= execute_sys_tasks(p, &state, reds); + int cost = execute_sys_tasks(p, &state, reds); + calls += cost; + reds -= cost; if (reds <= 0 #ifdef ERTS_DIRTY_SCHEDULERS || ERTS_SCHEDULER_IS_DIRTY(esdp) || (state & ERTS_PSFLGS_DIRTY_WORK) #endif ) { - p->fcalls = reds; goto sched_out_proc; } } @@ -9910,8 +9921,9 @@ Process *schedule(Process *p, int calls) if (((state & (ERTS_PSFLG_SUSPENDED | ERTS_PSFLG_ACTIVE)) != ERTS_PSFLG_ACTIVE) - && !(state & ERTS_PSFLG_EXITING)) + && !(state & ERTS_PSFLG_EXITING)) { goto sched_out_proc; + } n = e = state; n &= ~ERTS_PSFLG_RUNNING_SYS; @@ -9930,11 +9942,11 @@ Process *schedule(Process *p, int calls) if (ERTS_IS_GC_DESIRED(p)) { if (!(state & ERTS_PSFLG_EXITING) && !(p->flags & (F_DELAY_GC|F_DISABLE_GC))) { - reds -= erts_garbage_collect_nobump(p, 0, p->arg_reg, p->arity); - if (reds <= 0) { - p->fcalls = reds; + int cost = scheduler_gc_proc(p, reds); + calls += cost; + reds -= cost; + if (reds <= 0) goto sched_out_proc; - } } } @@ -9942,6 +9954,8 @@ Process *schedule(Process *p, int calls) free_proxy_proc(proxy_p); proxy_p = NULL; } + + p->fcalls = reds; ERTS_SMP_CHK_HAVE_ONLY_MAIN_PROC_LOCK(p); @@ -10211,21 +10225,24 @@ execute_sys_tasks(Process *c_p, erts_aint32_t *statep, int in_reds) else { if (!garbage_collected) { FLAGS(c_p) |= F_NEED_FULLSWEEP; - reds -= erts_garbage_collect_nobump(c_p, - 0, - c_p->arg_reg, - c_p->arity); + reds -= scheduler_gc_proc(c_p, reds); garbage_collected = 1; } st_res = am_true; } break; case ERTS_PSTT_CPC: { + int fcalls; int cpc_reds = 0; + if (!ERTS_PROC_GET_SAVED_CALLS_BUF(c_p)) + fcalls = reds; + else + fcalls = reds - CONTEXT_REDS; st_res = erts_check_process_code(c_p, st->arg[0], unsigned_val(st->arg[1]), - &cpc_reds); + &cpc_reds, + fcalls); reds -= cpc_reds; if (is_non_value(st_res)) { /* Needed gc, but gc was disabled */ @@ -10257,6 +10274,9 @@ execute_sys_tasks(Process *c_p, erts_aint32_t *statep, int in_reds) *statep = state; + if (in_reds < reds) + return in_reds; + return in_reds - reds; } @@ -11482,8 +11502,10 @@ delete_process(Process* p) psd = (ErtsPSD *) erts_smp_atomic_read_nob(&p->psd); - if (psd) + if (psd) { + erts_smp_atomic_set_nob(&p->psd, (erts_aint_t) NULL); /* Reduction counting depends on this... */ erts_free(ERTS_ALC_T_PSD, psd); + } /* Clean binaries and funs */ erts_cleanup_offheap(&p->off_heap); @@ -12577,6 +12599,8 @@ erts_continue_exit_process(Process *p) dep = (p->flags & F_DISTRIBUTION) ? erts_this_dist_entry : NULL; scb = ERTS_PROC_SET_SAVED_CALLS_BUF(p, NULL); + if (scb) + p->fcalls += CONTEXT_REDS; /* Reduction counting depends on this... */ pbt = ERTS_PROC_SET_CALL_TIME(p, NULL); nif_export = ERTS_PROC_SET_NIF_TRAP_EXPORT(p, NULL); diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h index 1c01d705a7..59da9c1779 100644 --- a/erts/emulator/beam/erl_process.h +++ b/erts/emulator/beam/erl_process.h @@ -805,8 +805,15 @@ erts_smp_reset_max_len(ErtsRunQueue *rq, ErtsRunQueueInfo *rqi) #define ERTS_PSD_CALL_TIME_BP 3 #define ERTS_PSD_DELAYED_GC_TASK_QS 4 #define ERTS_PSD_NIF_TRAP_EXPORT 5 +#ifdef HIPE +#define ERTS_PSD_SUSPENDED_SAVED_CALLS_BUF 6 +#endif +#ifdef HIPE +#define ERTS_PSD_SIZE 7 +#else #define ERTS_PSD_SIZE 6 +#endif typedef struct { void *data[ERTS_PSD_SIZE]; @@ -1080,6 +1087,10 @@ struct process { Uint space_verified; /* Avoid HAlloc forcing heap fragments when */ Eterm* space_verified_from; /* we rely on available heap space (TestHeap) */ #endif + +#ifdef DEBUG + Uint debug_reds_in; +#endif }; extern const Process erts_invalid_process; @@ -1351,6 +1362,7 @@ extern int erts_system_profile_ts_type; #define F_DELAY_GC (1 << 16) /* Similar to disable GC (see below) */ #define F_SCHDLR_ONLN_WAITQ (1 << 17) /* Process enqueued waiting to change schedulers online */ #define F_HAVE_BLCKD_NMSCHED (1 << 18) /* Process has blocked normal multi-scheduling */ +#define F_HIPE_MODE (1 << 19) /* * F_DISABLE_GC and F_DELAY_GC are similar. Both will prevent @@ -2008,6 +2020,13 @@ erts_psd_set(Process *p, int ix, void *data) #define ERTS_PROC_SET_NIF_TRAP_EXPORT(P, NTE) \ erts_psd_set((P), ERTS_PSD_NIF_TRAP_EXPORT, (void *) (NTE)) +#ifdef HIPE +#define ERTS_PROC_GET_SUSPENDED_SAVED_CALLS_BUF(P) \ + ((struct saved_calls *) erts_psd_get((P), ERTS_PSD_SUSPENDED_SAVED_CALLS_BUF)) +#define ERTS_PROC_SET_SUSPENDED_SAVED_CALLS_BUF(P, SCB) \ + ((struct saved_calls *) erts_psd_set((P), ERTS_PSD_SUSPENDED_SAVED_CALLS_BUF, (void *) (SCB))) +#endif + ERTS_GLB_INLINE Eterm erts_proc_get_error_handler(Process *p); ERTS_GLB_INLINE Eterm erts_proc_set_error_handler(Process *p, Eterm handler); diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c index 128696270b..436b4aca21 100644 --- a/erts/emulator/beam/erl_trace.c +++ b/erts/emulator/beam/erl_trace.c @@ -1322,16 +1322,18 @@ trace_proc_spawn(Process *p, Eterm what, Eterm pid, void save_calls(Process *p, Export *e) { - struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(p); - if (scb) { - Export **ct = &scb->ct[0]; - int len = scb->len; - - ct[scb->cur] = e; - if (++scb->cur >= len) - scb->cur = 0; - if (scb->n < len) - scb->n++; + if ((ERTS_TRACE_FLAGS(p) & F_SENSITIVE) == 0) { + struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(p); + if (scb) { + Export **ct = &scb->ct[0]; + int len = scb->len; + + ct[scb->cur] = e; + if (++scb->cur >= len) + scb->cur = 0; + if (scb->n < len) + scb->n++; + } } } diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index a7bc990deb..49eec44053 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -997,7 +997,7 @@ Eterm erl_is_function(Process* p, Eterm arg1, Eterm arg2); #define ERTS_CPC_ALLOW_GC (1 << 0) #define ERTS_CPC_COPY_LITERALS (1 << 1) #define ERTS_CPC_ALL (ERTS_CPC_ALLOW_GC | ERTS_CPC_COPY_LITERALS) -Eterm erts_check_process_code(Process *c_p, Eterm module, Uint flags, int *redsp); +Eterm erts_check_process_code(Process *c_p, Eterm module, Uint flags, int *redsp, int fcalls); typedef struct { Eterm *ptr; diff --git a/erts/emulator/hipe/hipe_mode_switch.c b/erts/emulator/hipe/hipe_mode_switch.c index 43144e75ec..9ad44b25ac 100644 --- a/erts/emulator/hipe/hipe_mode_switch.c +++ b/erts/emulator/hipe/hipe_mode_switch.c @@ -218,15 +218,37 @@ static __inline__ void hipe_pop_beam_trap_frame(Process *p) Process *hipe_mode_switch(Process *p, unsigned cmd, Eterm reg[]) { unsigned result; -#if NR_ARG_REGS > 5 - /* When NR_ARG_REGS > 5, we need to protect the process' input - reduction count (which BEAM stores in def_arg_reg[5]) from - being clobbered by the arch glue code. */ Eterm reds_in = p->def_arg_reg[5]; -#endif -#if NR_ARG_REGS > 4 - Eterm o_reds = p->def_arg_reg[4]; -#endif + /* + * Process is in the normal case scheduled out when reduction + * count reach zero. When "save calls" is enabled reduction + * count is subtracted with CONTEXT_REDS, i.e. initial reduction + * count will be zero or less and process is scheduled out + * when -CONTEXT_REDS is reached. + * + * HiPE does not support the "save calls" feature, so we switch + * to using a positive reduction counter when executing in + * hipe mode, but need to restore the "save calls" when + * returning to beam. We also need to hide the save calls buffer + * from BIFs. We do that by moving the saved calls buf to + * suspended saved calls buf. + * + * Beam has initial reduction count in stored in p->def_arg_reg[5]. + * + * Beam expects -neg_o_reds to be found in p->def_arg_reg[4] + * on return to beam. + */ + + { + struct saved_calls *scb = ERTS_PROC_SET_SAVED_CALLS_BUF(p, NULL); + if (scb) { + reds_in += CONTEXT_REDS; + p->fcalls += CONTEXT_REDS; + ERTS_PROC_SET_SUSPENDED_SAVED_CALLS_BUF(p, scb); + } + } + + p->flags |= F_HIPE_MODE; /* inform bifs where we are comming from... */ p->i = NULL; /* Set current_function to undefined. stdlib hibernate tests rely on it. */ @@ -481,12 +503,21 @@ Process *hipe_mode_switch(Process *p, unsigned cmd, Eterm reg[]) erts_smp_proc_unlock(p, ERTS_PROC_LOCKS_MSG_RECEIVE); do_schedule: { -#if !(NR_ARG_REGS > 5) - int reds_in = p->def_arg_reg[5]; + struct saved_calls *scb; + + scb = ERTS_PROC_SET_SUSPENDED_SAVED_CALLS_BUF(p, NULL); + if (scb) + ERTS_PROC_SET_SAVED_CALLS_BUF(p, scb); + +#ifdef DEBUG + ASSERT(p->debug_reds_in == reds_in); #endif + p->flags &= ~F_HIPE_MODE; + ERTS_SMP_UNREQ_PROC_MAIN_LOCK(p); p = schedule(p, reds_in - p->fcalls); ERTS_SMP_REQ_PROC_MAIN_LOCK(p); + ASSERT(!(p->flags & F_HIPE_MODE)); #ifdef ERTS_SMP p->hipe_smp.have_receive_locks = 0; reg = p->scheduler_data->x_reg_array; @@ -501,28 +532,32 @@ Process *hipe_mode_switch(Process *p, unsigned cmd, Eterm reg[]) reg[i] = argp[i]; } { -#if !(NR_ARG_REGS > 5) - Eterm reds_in; -#endif -#if !(NR_ARG_REGS > 4) - Eterm o_reds; -#endif + struct saved_calls *scb; reds_in = p->fcalls; - o_reds = 0; - if (ERTS_PROC_GET_SAVED_CALLS_BUF(p)) { - o_reds = reds_in; - reds_in = 0; - p->fcalls = 0; - } - p->def_arg_reg[4] = o_reds; p->def_arg_reg[5] = reds_in; +#ifdef DEBUG + p->debug_reds_in = reds_in; +#endif if (p->i == hipe_beam_pc_resume) { + p->flags |= F_HIPE_MODE; /* inform bifs where we are comming from... */ + scb = ERTS_PROC_SET_SAVED_CALLS_BUF(p, NULL); + if (scb) + ERTS_PROC_SET_SUSPENDED_SAVED_CALLS_BUF(p, scb); p->i = NULL; p->arity = 0; goto do_resume; } + + scb = ERTS_PROC_GET_SAVED_CALLS_BUF(p); + if (!scb) + p->def_arg_reg[4] = 0; + else { + p->def_arg_reg[4] = CONTEXT_REDS; + p->fcalls = -CONTEXT_REDS + reds_in; + } } + HIPE_CHECK_PCB(p); result = HIPE_MODE_SWITCH_RES_CALL_BEAM; p->def_arg_reg[3] = result; @@ -562,14 +597,29 @@ Process *hipe_mode_switch(Process *p, unsigned cmd, Eterm reg[]) default: erts_exit(ERTS_ERROR_EXIT, "hipe_mode_switch: result %#x\r\n", result); } + + { + struct saved_calls *scb = ERTS_PROC_SET_SUSPENDED_SAVED_CALLS_BUF(p, NULL); + if (!scb) + p->def_arg_reg[4] = 0; + else { + p->def_arg_reg[4] = CONTEXT_REDS; + p->fcalls -= CONTEXT_REDS; + ERTS_PROC_SET_SAVED_CALLS_BUF(p, scb); + } + } + HIPE_CHECK_PCB(p); p->def_arg_reg[3] = result; -#if NR_ARG_REGS > 4 - p->def_arg_reg[4] = o_reds; -#endif #if NR_ARG_REGS > 5 + /* + * When NR_ARG_REGS > 5, we need to protect the process' input + * reduction count (which BEAM stores in def_arg_reg[5]) from + * being clobbered by the arch glue code. + */ p->def_arg_reg[5] = reds_in; #endif + p->flags &= ~F_HIPE_MODE; return p; } diff --git a/erts/emulator/test/save_calls_SUITE.erl b/erts/emulator/test/save_calls_SUITE.erl index af1a0d35d6..aae7651f6d 100644 --- a/erts/emulator/test/save_calls_SUITE.erl +++ b/erts/emulator/test/save_calls_SUITE.erl @@ -60,7 +60,7 @@ dont_break_reductions(Config) when is_list(Config) -> RPS1 = reds_per_sched(0), RPS2 = reds_per_sched(20), Diff = abs(RPS1 - RPS2), - true = (Diff < (0.05 * RPS1)), + true = (Diff < (0.2 * RPS1)), ok. diff --git a/erts/preloaded/ebin/erl_prim_loader.beam b/erts/preloaded/ebin/erl_prim_loader.beam Binary files differindex 77685013ae..3e82b8e20e 100644 --- a/erts/preloaded/ebin/erl_prim_loader.beam +++ b/erts/preloaded/ebin/erl_prim_loader.beam diff --git a/erts/preloaded/ebin/erl_tracer.beam b/erts/preloaded/ebin/erl_tracer.beam Binary files differindex b8f3f6d8c2..67d96d0f0d 100644 --- a/erts/preloaded/ebin/erl_tracer.beam +++ b/erts/preloaded/ebin/erl_tracer.beam diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam Binary files differindex 15e4ca82a7..321e4e7e1b 100644 --- a/erts/preloaded/ebin/erlang.beam +++ b/erts/preloaded/ebin/erlang.beam diff --git a/erts/preloaded/ebin/erts_code_purger.beam b/erts/preloaded/ebin/erts_code_purger.beam Binary files differindex 3e95b1e42e..0c667663fd 100644 --- a/erts/preloaded/ebin/erts_code_purger.beam +++ b/erts/preloaded/ebin/erts_code_purger.beam diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam Binary files differindex 53dd2897de..ed2e328f5b 100644 --- a/erts/preloaded/ebin/erts_internal.beam +++ b/erts/preloaded/ebin/erts_internal.beam diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam Binary files differindex ee32066f53..23ebd2cad9 100644 --- a/erts/preloaded/ebin/init.beam +++ b/erts/preloaded/ebin/init.beam diff --git a/erts/preloaded/ebin/otp_ring0.beam b/erts/preloaded/ebin/otp_ring0.beam Binary files differindex 51a412b7f7..b63fa24848 100644 --- a/erts/preloaded/ebin/otp_ring0.beam +++ b/erts/preloaded/ebin/otp_ring0.beam diff --git a/erts/preloaded/ebin/prim_eval.beam b/erts/preloaded/ebin/prim_eval.beam Binary files differindex 45bed5cf7e..7c8fdc82c0 100644 --- a/erts/preloaded/ebin/prim_eval.beam +++ b/erts/preloaded/ebin/prim_eval.beam diff --git a/erts/preloaded/ebin/prim_file.beam b/erts/preloaded/ebin/prim_file.beam Binary files differindex c25bffb6a5..d4559bc9ed 100644 --- a/erts/preloaded/ebin/prim_file.beam +++ b/erts/preloaded/ebin/prim_file.beam diff --git a/erts/preloaded/ebin/prim_inet.beam b/erts/preloaded/ebin/prim_inet.beam Binary files differindex 85d74de065..5a0678632e 100644 --- a/erts/preloaded/ebin/prim_inet.beam +++ b/erts/preloaded/ebin/prim_inet.beam diff --git a/erts/preloaded/ebin/prim_zip.beam b/erts/preloaded/ebin/prim_zip.beam Binary files differindex 1f8fe6f03b..3d32dd8449 100644 --- a/erts/preloaded/ebin/prim_zip.beam +++ b/erts/preloaded/ebin/prim_zip.beam diff --git a/erts/preloaded/ebin/zlib.beam b/erts/preloaded/ebin/zlib.beam Binary files differindex 059585ec99..ced9f9c952 100644 --- a/erts/preloaded/ebin/zlib.beam +++ b/erts/preloaded/ebin/zlib.beam diff --git a/lib/common_test/doc/src/ct.xml b/lib/common_test/doc/src/ct.xml index 23aeaa38ea..5231ef24a4 100644 --- a/lib/common_test/doc/src/ct.xml +++ b/lib/common_test/doc/src/ct.xml @@ -601,18 +601,21 @@ </func> <func> - <name>get_timetrap_info() -> {Time, Scale}</name> + <name>get_timetrap_info() -> {Time, {Scaling,ScaleVal}}</name> <fsummary>Reads information about the timetrap set for the current test case.</fsummary> <type> <v>Time = integer() | infinity</v> - <v>Scale = true | false</v> + <v>Scaling = true | false</v> + <v>ScaleVal = integer()</v> </type> <desc><marker id="get_timetrap_info-0"/> <p>Reads information about the timetrap set for the current test - case. <c>Scale</c> indicates if <c>Common Test</c> will attempt + case. <c>Scaling</c> indicates if <c>Common Test</c> will attempt to compensate timetraps automatically for runtime delays - introduced by, for example, tools like cover.</p> + introduced by, for example, tools like cover. <c>ScaleVal</c> is + the value of the current scaling multipler (always 1 if scaling is + disabled). Note the <c>Time</c> is not the scaled result.</p> </desc> </func> @@ -1136,7 +1139,7 @@ Opts.</fsummary> <type> <v>Opts = [OptTuples]</v> - <v>OptTuples = {dir, TestDirs} | {suite, Suites} | {group, Groups} | {testcase, Cases} | {spec, TestSpecs} | {join_specs, Bool} | {label, Label} | {config, CfgFiles} | {userconfig, UserConfig} | {allow_user_terms, Bool} | {logdir, LogDir} | {silent_connections, Conns} | {stylesheet, CSSFile} | {cover, CoverSpecFile} | {cover_stop, Bool} | {step, StepOpts} | {event_handler, EventHandlers} | {include, InclDirs} | {auto_compile, Bool} | {abort_if_missing_suites, Bool} | {create_priv_dir, CreatePrivDir} | {multiply_timetraps, M} | {scale_timetraps, Bool} | {repeat, N} | {duration, DurTime} | {until, StopTime} | {force_stop, ForceStop} | {decrypt, DecryptKeyOrFile} | {refresh_logs, LogDir} | {logopts, LogOpts} | {verbosity, VLevels} | {basic_html, Bool} | {ct_hooks, CTHs} | {enable_builtin_hooks, Bool} | {release_shell, Bool}</v> + <v>OptTuples = {dir, TestDirs} | {suite, Suites} | {group, Groups} | {testcase, Cases} | {spec, TestSpecs} | {join_specs, Bool} | {label, Label} | {config, CfgFiles} | {userconfig, UserConfig} | {allow_user_terms, Bool} | {logdir, LogDir} | {silent_connections, Conns} | {stylesheet, CSSFile} | {cover, CoverSpecFile} | {cover_stop, Bool} | {step, StepOpts} | {event_handler, EventHandlers} | {include, InclDirs} | {auto_compile, Bool} | {abort_if_missing_suites, Bool} | {create_priv_dir, CreatePrivDir} | {multiply_timetraps, M} | {scale_timetraps, Bool} | {repeat, N} | {duration, DurTime} | {until, StopTime} | {force_stop, ForceStop} | {decrypt, DecryptKeyOrFile} | {refresh_logs, LogDir} | {logopts, LogOpts} | {verbosity, VLevels} | {basic_html, Bool} | {esc_chars, Bool} | {ct_hooks, CTHs} | {enable_builtin_hooks, Bool} | {release_shell, Bool}</v> <v>TestDirs = [string()] | string()</v> <v>Suites = [string()] | [atom()] | string() | atom()</v> <v>Cases = [atom()] | atom()</v> diff --git a/lib/common_test/doc/src/ct_run.xml b/lib/common_test/doc/src/ct_run.xml index 88873ce5b2..9e6229f1dd 100644 --- a/lib/common_test/doc/src/ct_run.xml +++ b/lib/common_test/doc/src/ct_run.xml @@ -124,6 +124,7 @@ [-duration HHMMSS [-force_stop [skip_rest]]] | [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]] [-basic_html] + [-no_esc_chars] [-ct_hooks CTHModule1 CTHOpts1 and CTHModule2 CTHOpts2 and .. CTHModuleN CTHOptsN] [-exit_status ignore_config] @@ -162,6 +163,7 @@ [-duration HHMMSS [-force_stop [skip_rest]]] | [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]] [-basic_html] + [-no_esc_chars] [-ct_hooks CTHModule1 CTHOpts1 and CTHModule2 CTHOpts2 and .. CTHModuleN CTHOptsN] [-exit_status ignore_config]</pre> @@ -186,7 +188,8 @@ [-muliply_timetraps Multiplier] [-scale_timetraps] [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc] - [-basic_html]</pre> + [-basic_html] + [-no_esc_chars]</pre> </section> <section> diff --git a/lib/common_test/doc/src/ct_telnet.xml b/lib/common_test/doc/src/ct_telnet.xml index b35e511501..e2a45e894b 100644 --- a/lib/common_test/doc/src/ct_telnet.xml +++ b/lib/common_test/doc/src/ct_telnet.xml @@ -64,6 +64,8 @@ remaining string terminated) = 0</p></item> <item><p>Polling interval (sleep time between polls) = 1 second</p> </item> + <item><p>The TCP_NODELAY option for the telnet socket + is disabled (set to <c>false</c>) per default</p></item> </list> <p>These parameters can be modified by the user with the following @@ -76,7 +78,8 @@ {reconnection_interval,Millisec}, {keep_alive,Bool}, {poll_limit,N}, - {poll_interval,Millisec}]}.</pre> + {poll_interval,Millisec}, + {tcp_nodelay,Bool}]}.</pre> <p><c>Millisec = integer(), N = integer()</c></p> diff --git a/lib/common_test/doc/src/notes.xml b/lib/common_test/doc/src/notes.xml index aba71b0d4a..ebba864606 100644 --- a/lib/common_test/doc/src/notes.xml +++ b/lib/common_test/doc/src/notes.xml @@ -33,6 +33,68 @@ <file>notes.xml</file> </header> +<section><title>Common_Test 1.12.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + The <c>nodelay</c> option used to be enabled + (<c>true</c>) by default for sockets opened by the Common + Test telnet client. This appeared to cause communication + problems with telnet servers on some systems, and + therefore the option is no longer used. Its value may + instead be specified in the telnet connection settings. + See the man page for <c>ct_telnet</c> for details. Please + note that the interface function <c>connect</c> in + <c>unix_telnet</c> has been updated with an extra + argument and is now <c>unix_telnet:connect/7</c>.</p> + <p> + Own Id: OTP-13462 Aux Id: seq13077 </p> + </item> + <item> + <p> + Fix bug in cth_surefire: When a pre_init_per_suite hook + fails before reaching the + cth_surefire:pre_init_per_suite, cth_surefire produced + incorrect XML.</p> + <p> + Own Id: OTP-13513</p> + </item> + <item> + <p> + The <c>ct:get_timetrap_info/0</c> function has been + updated to return more information about timetrap + scaling.</p> + <p> + Own Id: OTP-13535</p> + </item> + <item> + <p> + A problem with stylesheet HTML tags getting incorrectly + escaped by Common Test has been corrected.</p> + <p> + Own Id: OTP-13536</p> + </item> + <item> + <p> + The <c>ct_run</c> start flag <c>-no_esc_chars</c> and + <c>ct:run_test/1</c> start option <c>{esc_chars,Bool}</c> + have been introduced to make it possible to disable + automatic escaping of characters. Automatic escaping of + special HTML characters printed with <c>io:format/1,2</c> + and <c>ct:pal/1,2,3,4</c> was introduced in Common Test + 1.12. The new flag/option may be used to disable this + feature for backwards compatibility reasons. (The option + is also supported in test specifications).</p> + <p> + Own Id: OTP-13537</p> + </item> + </list> + </section> + +</section> + <section><title>Common_Test 1.12</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/common_test/doc/src/run_test_chapter.xml b/lib/common_test/doc/src/run_test_chapter.xml index 5ae32ee230..43e36adfb6 100644 --- a/lib/common_test/doc/src/run_test_chapter.xml +++ b/lib/common_test/doc/src/run_test_chapter.xml @@ -266,6 +266,10 @@ <tag><c><![CDATA[-verbosity <levels>]]></c></tag> <item><p>Sets <seealso marker="write_test_chapter#logging">verbosity levels for printouts</seealso>.</p></item> + + <tag><c><![CDATA[-no_esc_chars]]></c></tag> + <item><p>Disables automatic escaping of special HTML characters. + See the <seealso marker="write_test_chapter#logging">Logging chapter</seealso>.</p></item> </taglist> <note><p>Directories passed to <c>Common Test</c> can have either relative or absolute paths.</p></note> @@ -802,7 +806,7 @@ program</seealso> for an overview of available start flags (as most flags have a corresponding configuration term)</item> <item><seealso marker="write_test_chapter#logging">Logging</seealso> - (for terms <c>verbosity</c>, <c>stylesheet</c> and <c>basic_html</c>)</item> + (for terms <c>verbosity</c>, <c>stylesheet</c>, <c>basic_html</c> and <c>esc_chars</c>)</item> <item><seealso marker="config_file_chapter#top">External Configuration Data</seealso> (for terms <c>config</c> and <c>userconfig</c>)</item> <item><seealso marker="event_handler_chapter#event_handling">Event @@ -887,6 +891,9 @@ {basic_html, Bool}. {basic_html, NodeRefs, Bool}. + {esc_chars, Bool}. + {esc_chars, NodeRefs, Bool}. + {release_shell, Bool}.</pre> <p><em>Test terms:</em></p> diff --git a/lib/common_test/doc/src/unix_telnet.xml b/lib/common_test/doc/src/unix_telnet.xml index 701d5ec88e..b2314a53ec 100644 --- a/lib/common_test/doc/src/unix_telnet.xml +++ b/lib/common_test/doc/src/unix_telnet.xml @@ -80,7 +80,7 @@ <funcs> <func> - <name>connect(ConnName, Ip, Port, Timeout, KeepAlive, Extra) -> {ok, Handle} | {error, Reason}</name> + <name>connect(ConnName, Ip, Port, Timeout, KeepAlive, TCPNoDelay, Extra) -> {ok, Handle} | {error, Reason}</name> <fsummary>Callback for ct_telnet.erl.</fsummary> <type> <v>ConnName = target_name()</v> @@ -88,6 +88,7 @@ <v>Port = integer()</v> <v>Timeout = integer()</v> <v>KeepAlive = bool()</v> + <v>TCPNoDelay = bool()</v> <v>Extra = target_name() | {Username, Password}</v> <v>Username = string()</v> <v>Password = string()</v> diff --git a/lib/common_test/doc/src/write_test_chapter.xml b/lib/common_test/doc/src/write_test_chapter.xml index 40e02347f2..83daf771a6 100644 --- a/lib/common_test/doc/src/write_test_chapter.xml +++ b/lib/common_test/doc/src/write_test_chapter.xml @@ -1047,9 +1047,15 @@ <p>Common Test will escape special HTML characters (<, > and &) in printouts to the log file made with <c>ct:pal/4</c> and <c>io:format/2</c>. In order to print - strings with HTML tags to the log, use the <c>ct:log/5</c> function. The character escaping - feature is per default disabled for <c>ct:log/5</c>, but can be enabled with the - <c>esc_chars</c> option.</p> + strings with HTML tags to the log, use the <c>ct:log/3,4,5</c> function. The character + escaping feature is per default disabled for <c>ct:log/3,4,5</c> but can be enabled with + the <c>esc_chars</c> option in the <c>Opts</c> list, see <seealso marker="ct#log-5"> + <c>ct:log/3,4,5</c></seealso>.</p> + + <p>If the character escaping feature needs to be disabled (typically for backwards + compatibility reasons), use the <c>ct_run</c> start flag <c>-no_esc_chars</c>, or the + <c>ct:run_test/1</c> start option <c>{esc_chars,Bool}</c> (this start option is also + supported in test specifications).</p> <p>For more information about log files, see section <seealso marker="run_test_chapter#log_files">Log Files</seealso> diff --git a/lib/common_test/src/ct.erl b/lib/common_test/src/ct.erl index 7fe90b60ff..cae7bea406 100644 --- a/lib/common_test/src/ct.erl +++ b/lib/common_test/src/ct.erl @@ -161,9 +161,9 @@ run(TestDirs) -> %%% {repeat,N} | {duration,DurTime} | {until,StopTime} | %%% {force_stop,ForceStop} | {decrypt,DecryptKeyOrFile} | %%% {refresh_logs,LogDir} | {logopts,LogOpts} | -%%% {verbosity,VLevels} | {basic_html,Bool} | -%%% {ct_hooks, CTHs} | {enable_builtin_hooks,Bool} | -%%% {release_shell,Bool} +%%% {verbosity,VLevels} | {basic_html,Bool} | +%%% {esc_chars,Bool} | {ct_hooks, CTHs} | +%%% {enable_builtin_hooks,Bool} | {release_shell,Bool} %%% TestDirs = [string()] | string() %%% Suites = [string()] | [atom()] | string() | atom() %%% Cases = [atom()] | atom() diff --git a/lib/common_test/src/ct_groups.erl b/lib/common_test/src/ct_groups.erl index 80f5c30c2a..dd04c5410a 100644 --- a/lib/common_test/src/ct_groups.erl +++ b/lib/common_test/src/ct_groups.erl @@ -325,7 +325,7 @@ modify_tc_list1(GrSpecTs, TSCs) -> true -> {[TC|TSCs1],lists:delete(TC,GrSpecTs2)}; false -> - case lists:keymember(TC, 2, GrSpecTs) of + case lists:keysearch(TC, 2, GrSpecTs) of {value,Test} -> {[Test|TSCs1], lists:keydelete(TC, 2, GrSpecTs2)}; diff --git a/lib/common_test/src/ct_hooks.erl b/lib/common_test/src/ct_hooks.erl index d8f583455b..5422d449fd 100644 --- a/lib/common_test/src/ct_hooks.erl +++ b/lib/common_test/src/ct_hooks.erl @@ -67,6 +67,8 @@ terminate(Hooks) -> %% tests. -spec init_tc(Mod :: atom(), FuncSpec :: atom() | + {ConfigFunc :: init_per_testcase | end_per_testcase, + TestCase :: atom()} | {ConfigFunc :: init_per_group | end_per_group, GroupName :: atom(), Properties :: list()}, @@ -103,7 +105,9 @@ init_tc(_Mod, TC = error_in_suite, Config) -> %% @doc Called as each test case is completed. This includes all configuration %% tests. -spec end_tc(Mod :: atom(), - FuncSpec :: atom() | + FuncSpec :: atom() | + {ConfigFunc :: init_per_testcase | end_per_testcase, + TestCase :: atom()} | {ConfigFunc :: init_per_group | end_per_group, GroupName :: atom(), Properties :: list()}, diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl index 77828a2186..29b38e9748 100644 --- a/lib/common_test/src/ct_logs.erl +++ b/lib/common_test/src/ct_logs.erl @@ -609,7 +609,8 @@ log_timestamp({MS,S,US}) -> ct_log_fd, tc_groupleaders, stylesheet, - async_print_jobs}). + async_print_jobs, + tc_esc_chars}). logger(Parent, Mode, Verbosity) -> register(?MODULE,self()), @@ -728,14 +729,18 @@ logger(Parent, Mode, Verbosity) -> end end || {Cat,VLvl} <- Verbosity], io:nl(CtLogFd), - + TcEscChars = case application:get_env(common_test, esc_chars) of + {ok,ECBool} -> ECBool; + _ -> true + end, logger_loop(#logger_state{parent=Parent, log_dir=AbsDir, start_time=Time, orig_GL=group_leader(), ct_log_fd=CtLogFd, tc_groupleaders=[], - async_print_jobs=[]}). + async_print_jobs=[], + tc_esc_chars=TcEscChars}). copy_priv_files([SrcF | SrcFs], [DestF | DestFs]) -> case file:copy(SrcF, DestF) of @@ -761,20 +766,21 @@ logger_loop(State) -> end, if Importance >= (100-VLvl) -> CtLogFd = State#logger_state.ct_log_fd, + DoEscChars = State#logger_state.tc_esc_chars and EscChars, case get_groupleader(Pid, GL, State) of {tc_log,TCGL,TCGLs} -> case erlang:is_process_alive(TCGL) of true -> State1 = print_to_log(SyncOrAsync, Pid, Category, TCGL, Content, - EscChars, State), + DoEscChars, State), logger_loop(State1#logger_state{ tc_groupleaders = TCGLs}); false -> %% Group leader is dead, so write to the %% CtLog or unexpected_io log instead unexpected_io(Pid, Category, Importance, - Content, CtLogFd, EscChars), + Content, CtLogFd, DoEscChars), logger_loop(State) end; @@ -783,7 +789,7 @@ logger_loop(State) -> %% to ct_log, else write to unexpected_io %% log unexpected_io(Pid, Category, Importance, Content, - CtLogFd, EscChars), + CtLogFd, DoEscChars), logger_loop(State#logger_state{ tc_groupleaders = TCGLs}) end; @@ -794,7 +800,7 @@ logger_loop(State) -> %% make sure no IO for this test case from the %% CT logger gets rejected test_server:permit_io(GL, self()), - print_style(GL, State#logger_state.stylesheet), + print_style(GL,GL,State#logger_state.stylesheet), set_evmgr_gl(GL), TCGLs = add_tc_gl(TCPid,GL,State), if not RefreshLog -> @@ -882,7 +888,7 @@ create_io_fun(FromPid, CtLogFd, EscChars) -> {_HdOrFt,S,A} -> {false,S,A}; {S,A} -> {true,S,A} end, - try io_lib:format(Str,Args) of + try io_lib:format(Str, Args) of IoStr when Escapable, EscChars, IoList == [] -> escape_chars(IoStr); IoStr when Escapable, EscChars -> @@ -925,7 +931,12 @@ print_to_log(sync, FromPid, Category, TCGL, Content, EscChars, State) -> if FromPid /= TCGL -> IoFun = create_io_fun(FromPid, CtLogFd, EscChars), IoList = lists:foldl(IoFun, [], Content), - io:format(TCGL,["$tc_html","~ts"], [IoList]); + try io:format(TCGL,["$tc_html","~ts"], [IoList]) of + ok -> ok + catch + _:_ -> + io:format(TCGL,"~ts", [IoList]) + end; true -> unexpected_io(FromPid, Category, ?MAX_IMPORTANCE, Content, CtLogFd, EscChars) @@ -958,7 +969,10 @@ print_to_log(async, FromPid, Category, TCGL, Content, EscChars, State) -> _:terminated -> unexpected_io(FromPid, Category, ?MAX_IMPORTANCE, - Content, CtLogFd, EscChars) + Content, CtLogFd, EscChars); + _:_ -> + io:format(TCGL, "~ts", + [lists:foldl(IoFun,[],Content)]) end; false -> unexpected_io(FromPid, Category, @@ -1099,26 +1113,27 @@ open_ctlog(MiscIoName) -> "View I/O logged after the test run</a></li>\n</ul>\n", [MiscIoName,MiscIoName]), - print_style(Fd,undefined), + print_style(Fd,group_leader(),undefined), io:format(Fd, xhtml("<br><h2>Progress Log</h2>\n<pre>\n", "<br />\n<h4>PROGRESS LOG</h4>\n<pre>\n"), []), Fd. -print_style(Fd,undefined) -> +print_style(Fd,GL,undefined) -> case basic_html() of true -> - io:format(Fd, - "<style>\n" - "div.ct_internal { background:lightgrey; color:black; }\n" - "div.default { background:lightgreen; color:black; }\n" - "</style>\n", - []); + Style = "<style>\n + div.ct_internal { background:lightgrey; color:black; }\n + div.default { background:lightgreen; color:black; }\n + </style>\n", + if Fd == GL -> io:format(["$tc_html",Style], []); + true -> io:format(Fd, Style, []) + end; _ -> ok end; -print_style(Fd,StyleSheet) -> +print_style(Fd,GL,StyleSheet) -> case file:read_file(StyleSheet) of {ok,Bin} -> Str = b2s(Bin,encoding(StyleSheet)), @@ -1131,23 +1146,30 @@ print_style(Fd,StyleSheet) -> N1 -> N1 end, if (Pos0 == 0) and (Pos1 /= 0) -> - print_style_error(Fd,StyleSheet,missing_style_start_tag); + print_style_error(Fd,GL,StyleSheet,missing_style_start_tag); (Pos0 /= 0) and (Pos1 == 0) -> - print_style_error(Fd,StyleSheet,missing_style_end_tag); + print_style_error(Fd,GL,StyleSheet,missing_style_end_tag); Pos0 /= 0 -> Style = string:sub_string(Str,Pos0,Pos1+7), - io:format(Fd,"~ts\n",[Style]); + if Fd == GL -> io:format(Fd,["$tc_html","~ts\n"],[Style]); + true -> io:format(Fd,"~ts\n",[Style]) + end; Pos0 == 0 -> - io:format(Fd,"<style>~ts</style>\n",[Str]) + if Fd == GL -> io:format(Fd,["$tc_html","<style>\n~ts</style>\n"],[Str]); + true -> io:format(Fd,"<style>\n~ts</style>\n",[Str]) + end end; {error,Reason} -> - print_style_error(Fd,StyleSheet,Reason) + print_style_error(Fd,GL,StyleSheet,Reason) end. -print_style_error(Fd,StyleSheet,Reason) -> - io:format(Fd,"\n<!-- Failed to load stylesheet ~ts: ~p -->\n", - [StyleSheet,Reason]), - print_style(Fd,undefined). +print_style_error(Fd,GL,StyleSheet,Reason) -> + IO = io_lib:format("\n<!-- Failed to load stylesheet ~ts: ~p -->\n", + [StyleSheet,Reason]), + if Fd == GL -> io:format(Fd,["$tc_html",IO],[]); + true -> io:format(Fd,IO,[]) + end, + print_style(Fd,GL,undefined). close_ctlog(Fd) -> io:format(Fd, "\n</pre>\n", []), diff --git a/lib/common_test/src/ct_master.erl b/lib/common_test/src/ct_master.erl index 32c8ab96ec..c4905b316f 100644 --- a/lib/common_test/src/ct_master.erl +++ b/lib/common_test/src/ct_master.erl @@ -27,7 +27,7 @@ -export([run_on_node/2,run_on_node/3]). -export([run_test/1,run_test/2]). -export([get_event_mgr_ref/0]). --export([basic_html/1]). +-export([basic_html/1,esc_chars/1]). -export([abort/0,abort/1,progress/0]). @@ -317,6 +317,16 @@ basic_html(Bool) -> ok. %%%----------------------------------------------------------------- +%%% @spec esc_chars(Bool) -> ok +%%% Bool = true | false +%%% +%%% @doc If set to false, the ct_master logs will be written without +%%% special characters being escaped in the HTML logs. +esc_chars(Bool) -> + application:set_env(common_test_master, esc_chars, Bool), + ok. + +%%%----------------------------------------------------------------- %%% MASTER, runs on central controlling node. %%%----------------------------------------------------------------- start_master(NodeOptsList) -> diff --git a/lib/common_test/src/ct_run.erl b/lib/common_test/src/ct_run.erl index e156c9b773..1e5f935198 100644 --- a/lib/common_test/src/ct_run.erl +++ b/lib/common_test/src/ct_run.erl @@ -65,6 +65,7 @@ logdir, logopts = [], basic_html, + esc_chars = true, verbosity = [], config = [], event_handlers = [], @@ -346,6 +347,15 @@ script_start1(Parent, Args) -> application:set_env(common_test, basic_html, true), true end, + %% esc_chars - used by ct_logs + EscChars = case proplists:get_value(no_esc_chars, Args) of + undefined -> + application:set_env(common_test, esc_chars, true), + undefined; + _ -> + application:set_env(common_test, esc_chars, false), + false + end, %% disable_log_cache - used by ct_logs case proplists:get_value(disable_log_cache, Args) of undefined -> @@ -359,6 +369,7 @@ script_start1(Parent, Args) -> cover = Cover, cover_stop = CoverStop, logdir = LogDir, logopts = LogOpts, basic_html = BasicHtml, + esc_chars = EscChars, verbosity = Verbosity, event_handlers = EvHandlers, ct_hooks = CTHooks, @@ -587,6 +598,17 @@ combine_test_opts(TS, Specs, Opts) -> BHBool end, + EscChars = + case choose_val(Opts#opts.esc_chars, + TSOpts#opts.esc_chars) of + undefined -> + true; + ECBool -> + application:set_env(common_test, esc_chars, + ECBool), + ECBool + end, + Opts#opts{label = Label, profile = Profile, testspec_files = Specs, @@ -595,6 +617,7 @@ combine_test_opts(TS, Specs, Opts) -> logdir = which(logdir, LogDir), logopts = AllLogOpts, basic_html = BasicHtml, + esc_chars = EscChars, verbosity = AllVerbosity, silent_connections = AllSilentConns, config = TSOpts#opts.config, @@ -795,6 +818,7 @@ script_usage() -> "\n\t [-scale_timetraps]" "\n\t [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]" "\n\t [-basic_html]" + "\n\t [-no_esc_chars]" "\n\t [-repeat N] |" "\n\t [-duration HHMMSS [-force_stop [skip_rest]]] |" "\n\t [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]]" @@ -822,6 +846,7 @@ script_usage() -> "\n\t [-scale_timetraps]" "\n\t [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]" "\n\t [-basic_html]" + "\n\t [-no_esc_chars]" "\n\t [-repeat N] |" "\n\t [-duration HHMMSS [-force_stop [skip_rest]]] |" "\n\t [-until [YYMoMoDD]HHMMSS [-force_stop [skip_rest]]]\n\n"), @@ -847,7 +872,8 @@ script_usage() -> "\n\t [-multiply_timetraps N]" "\n\t [-scale_timetraps]" "\n\t [-create_priv_dir auto_per_run | auto_per_tc | manual_per_tc]" - "\n\t [-basic_html]\n\n"). + "\n\t [-basic_html]" + "\n\t [-no_esc_chars]\n\n"). %%%----------------------------------------------------------------- %%% @hidden @@ -1089,7 +1115,17 @@ run_test2(StartOpts) -> application:set_env(common_test, basic_html, BasicHtmlBool), BasicHtmlBool end, - + %% esc_chars - used by ct_logs + EscChars = + case proplists:get_value(esc_chars, StartOpts) of + undefined -> + application:set_env(common_test, esc_chars, true), + undefined; + EscCharsBool -> + application:set_env(common_test, esc_chars, EscCharsBool), + EscCharsBool + end, + %% disable_log_cache - used by ct_logs case proplists:get_value(disable_log_cache, StartOpts) of undefined -> application:set_env(common_test, disable_log_cache, false); @@ -1104,6 +1140,7 @@ run_test2(StartOpts) -> cover = Cover, cover_stop = CoverStop, step = Step, logdir = LogDir, logopts = LogOpts, basic_html = BasicHtml, + esc_chars = EscChars, config = CfgFiles, verbosity = Verbosity, event_handlers = EvHandlers, @@ -1445,6 +1482,7 @@ get_data_for_node(#testspec{label = Labels, logdir = LogDirs, logopts = LogOptsList, basic_html = BHs, + esc_chars = EscChs, stylesheet = SSs, verbosity = VLvls, silent_connections = SilentConnsList, @@ -1472,6 +1510,7 @@ get_data_for_node(#testspec{label = Labels, LOs -> LOs end, BasicHtml = proplists:get_value(Node, BHs), + EscChars = proplists:get_value(Node, EscChs), Stylesheet = proplists:get_value(Node, SSs), Verbosity = case proplists:get_value(Node, VLvls) of undefined -> []; @@ -1498,6 +1537,7 @@ get_data_for_node(#testspec{label = Labels, logdir = LogDir, logopts = LogOpts, basic_html = BasicHtml, + esc_chars = EscChars, stylesheet = Stylesheet, verbosity = Verbosity, silent_connections = SilentConns, @@ -2182,10 +2222,18 @@ do_run_test(Tests, Skip, Opts0) -> %% test_server needs to know the include path too InclPath = case application:get_env(common_test, include) of {ok,Incls} -> Incls; - _ -> [] + _ -> [] end, application:set_env(test_server, include, InclPath), + %% copy the escape characters setting to test_server + EscChars = + case application:get_env(common_test, esc_chars) of + {ok,ECBool} -> ECBool; + _ -> true + end, + application:set_env(test_server, esc_chars, EscChars), + test_server_ctrl:start_link(local), %% let test_server expand the test tuples and count no of cases @@ -3069,6 +3117,10 @@ opts2args(EnvStartOpts) -> [{basic_html,[]}]; ({basic_html,false}) -> []; + ({esc_chars,false}) -> + [{no_esc_chars,[]}]; + ({esc_chars,true}) -> + []; ({event_handler,EH}) when is_atom(EH) -> [{event_handler,[atom_to_list(EH)]}]; ({event_handler,EHs}) when is_list(EHs) -> diff --git a/lib/common_test/src/ct_telnet.erl b/lib/common_test/src/ct_telnet.erl index 4d3fd2d094..f5f4f648f4 100644 --- a/lib/common_test/src/ct_telnet.erl +++ b/lib/common_test/src/ct_telnet.erl @@ -42,7 +42,8 @@ %% {reconnection_interval,Millisec}, %% {keep_alive,Bool}, %% {poll_limit,N}, -%% {poll_interval,Millisec}]}.</pre> +%% {poll_interval,Millisec}, +%% {tcp_nodelay,Bool}]}.</pre> %% <p><code>Millisec = integer(), N = integer()</code></p> %% <p>Enter the <code>telnet_settings</code> term in a configuration %% file included in the test and ct_telnet will retrieve the information @@ -182,7 +183,8 @@ conn_to=?DEFAULT_TIMEOUT, com_to=?DEFAULT_TIMEOUT, reconns=?RECONNS, - reconn_int=?RECONN_TIMEOUT}). + reconn_int=?RECONN_TIMEOUT, + tcp_nodelay=false}). %%%----------------------------------------------------------------- %%% @spec open(Name) -> {ok,Handle} | {error,Reason} @@ -602,8 +604,18 @@ init(Name,{Ip,Port,Type},{TargetMod,KeepAlive,Extra}) -> Settings -> set_telnet_defaults(Settings,#state{}) end, - case catch TargetMod:connect(Name,Ip,Port,S0#state.conn_to, - KeepAlive,Extra) of + %% Handle old user versions of TargetMod + code:ensure_loaded(TargetMod), + try + case erlang:function_exported(TargetMod,connect,7) of + true -> + TargetMod:connect(Name,Ip,Port,S0#state.conn_to, + KeepAlive,S0#state.tcp_nodelay,Extra); + false -> + TargetMod:connect(Name,Ip,Port,S0#state.conn_to, + KeepAlive,Extra) + end + of {ok,TelnPid} -> put({ct_telnet_pid2name,TelnPid},Name), S1 = S0#state{host=Ip, @@ -625,15 +637,18 @@ init(Name,{Ip,Port,Type},{TargetMod,KeepAlive,Extra}) -> "Connection timeout: ~p\n" "Keep alive: ~w\n" "Poll limit: ~w\n" - "Poll interval: ~w", + "Poll interval: ~w\n" + "TCP nodelay: ~w", [Ip,Port,S1#state.com_to,S1#state.reconns, S1#state.reconn_int,S1#state.conn_to,KeepAlive, - S1#state.poll_limit,S1#state.poll_interval]), + S1#state.poll_limit,S1#state.poll_interval, + S1#state.tcp_nodelay]), {ok,TelnPid,S1}; - {'EXIT',Reason} -> - {error,Reason}; Error -> Error + catch + _:Reason -> + {error,Reason} end. type(telnet) -> ip; @@ -653,6 +668,8 @@ set_telnet_defaults([{poll_limit,PL}|Ss],S) -> set_telnet_defaults(Ss,S#state{poll_limit=PL}); set_telnet_defaults([{poll_interval,PI}|Ss],S) -> set_telnet_defaults(Ss,S#state{poll_interval=PI}); +set_telnet_defaults([{tcp_nodelay,NoDelay}|Ss],S) -> + set_telnet_defaults(Ss,S#state{tcp_nodelay=NoDelay}); set_telnet_defaults([Unknown|Ss],S) -> force_log(S,error, "Bad element in telnet_settings: ~p",[Unknown]), @@ -794,8 +811,17 @@ reconnect(Ip,Port,N,State=#state{name=Name, keep_alive=KeepAlive, extra=Extra, conn_to=ConnTo, - reconn_int=ReconnInt}) -> - case TargetMod:connect(Name,Ip,Port,ConnTo,KeepAlive,Extra) of + reconn_int=ReconnInt, + tcp_nodelay=NoDelay}) -> + %% Handle old user versions of TargetMod + ConnResult = + case erlang:function_exported(TargetMod,connect,7) of + true -> + TargetMod:connect(Name,Ip,Port,ConnTo,KeepAlive,NoDelay,Extra); + false -> + TargetMod:connect(Name,Ip,Port,ConnTo,KeepAlive,Extra) + end, + case ConnResult of {ok,NewPid} -> put({ct_telnet_pid2name,NewPid},Name), {ok, NewPid, State#state{teln_pid=NewPid}}; diff --git a/lib/common_test/src/ct_telnet_client.erl b/lib/common_test/src/ct_telnet_client.erl index f1dee1f3bb..1f1311776f 100644 --- a/lib/common_test/src/ct_telnet_client.erl +++ b/lib/common_test/src/ct_telnet_client.erl @@ -35,7 +35,7 @@ %%-define(debug, true). --export([open/2, open/3, open/4, open/5, close/1]). +-export([open/2, open/3, open/4, open/5, open/6, close/1]). -export([send_data/2, send_data/3, get_data/1]). -define(TELNET_PORT, 23). @@ -70,19 +70,22 @@ -record(state,{conn_name, get_data, keep_alive=true, log_pos=1}). open(Server, ConnName) -> - open(Server, ?TELNET_PORT, ?OPEN_TIMEOUT, true, ConnName). + open(Server, ?TELNET_PORT, ?OPEN_TIMEOUT, true, false, ConnName). open(Server, Port, ConnName) -> - open(Server, Port, ?OPEN_TIMEOUT, true, ConnName). + open(Server, Port, ?OPEN_TIMEOUT, true, false, ConnName). open(Server, Port, Timeout, ConnName) -> - open(Server, Port, Timeout, true, ConnName). + open(Server, Port, Timeout, true, false, ConnName). open(Server, Port, Timeout, KeepAlive, ConnName) -> + open(Server, Port, Timeout, KeepAlive, false, ConnName). + +open(Server, Port, Timeout, KeepAlive, NoDelay, ConnName) -> Self = self(), Pid = spawn(fun() -> init(Self, Server, Port, Timeout, - KeepAlive, ConnName) + KeepAlive, NoDelay, ConnName) end), receive {open,Pid} -> @@ -114,8 +117,8 @@ get_data(Pid) -> %%%----------------------------------------------------------------- %%% Internal functions -init(Parent, Server, Port, Timeout, KeepAlive, ConnName) -> - case gen_tcp:connect(Server, Port, [list,{packet,0},{nodelay,true}], Timeout) of +init(Parent, Server, Port, Timeout, KeepAlive, NoDelay, ConnName) -> + case gen_tcp:connect(Server, Port, [list,{packet,0},{nodelay,NoDelay}], Timeout) of {ok,Sock} -> dbg("~p connected to: ~p (port: ~w, keep_alive: ~w)\n", [ConnName,Server,Port,KeepAlive]), diff --git a/lib/common_test/src/ct_testspec.erl b/lib/common_test/src/ct_testspec.erl index df5587b069..991abb0666 100644 --- a/lib/common_test/src/ct_testspec.erl +++ b/lib/common_test/src/ct_testspec.erl @@ -1146,8 +1146,9 @@ should_be_added(Tag,Node,_Data,Spec) -> if %% list terms *without* possible duplicates here Tag == logdir; Tag == logopts; - Tag == basic_html; Tag == label; - Tag == auto_compile; Tag == abort_if_missing_suites; + Tag == basic_html; Tag == esc_chars; + Tag == label; Tag == auto_compile; + Tag == abort_if_missing_suites; Tag == stylesheet; Tag == verbosity; Tag == silent_connections -> lists:keymember(ref2node(Node,Spec#testspec.nodes),1, @@ -1544,6 +1545,8 @@ valid_terms() -> {logopts,3}, {basic_html,2}, {basic_html,3}, + {esc_chars,2}, + {esc_chars,3}, {verbosity,2}, {verbosity,3}, {silent_connections,2}, diff --git a/lib/common_test/src/ct_util.erl b/lib/common_test/src/ct_util.erl index c372763ae9..d5a8e3fbc0 100644 --- a/lib/common_test/src/ct_util.erl +++ b/lib/common_test/src/ct_util.erl @@ -459,6 +459,7 @@ loop(Mode,TestData,StartDir) -> error:badarg -> [] end, ct_hooks:terminate(Callbacks), + close_connections(ets:tab2list(?conn_table)), ets:delete(?conn_table), ets:delete(?board_table), diff --git a/lib/common_test/src/ct_util.hrl b/lib/common_test/src/ct_util.hrl index c1cc1eafbd..d7efa26863 100644 --- a/lib/common_test/src/ct_util.hrl +++ b/lib/common_test/src/ct_util.hrl @@ -37,6 +37,7 @@ logdir=["."], logopts=[], basic_html=[], + esc_chars=[], verbosity=[], silent_connections=[], cover=[], diff --git a/lib/common_test/src/cth_log_redirect.erl b/lib/common_test/src/cth_log_redirect.erl index e762d5060f..33a3813a16 100644 --- a/lib/common_test/src/cth_log_redirect.erl +++ b/lib/common_test/src/cth_log_redirect.erl @@ -130,7 +130,14 @@ handle_event(Event, #eh_state{log_func = LogFunc} = State) -> tag_event(Event)), if is_list(SReport) -> SaslHeader = format_header(State), - ct_logs:LogFunc(sasl, ?STD_IMPORTANCE, SaslHeader, SReport, []); + case LogFunc of + tc_log -> + ct_logs:tc_log(sasl, ?STD_IMPORTANCE, + SaslHeader, SReport, [], []); + tc_log_async -> + ct_logs:tc_log_async(sasl, ?STD_IMPORTANCE, + SaslHeader, SReport, []) + end; true -> %% Report is an atom if no logging is to be done ignore end @@ -139,7 +146,14 @@ handle_event(Event, #eh_state{log_func = LogFunc} = State) -> tag_event(Event),io_lib), if is_list(EReport) -> ErrHeader = format_header(State), - ct_logs:LogFunc(error_logger, ?STD_IMPORTANCE, ErrHeader, EReport, []); + case LogFunc of + tc_log -> + ct_logs:tc_log(error_logger, ?STD_IMPORTANCE, + ErrHeader, EReport, [], []); + tc_log_async -> + ct_logs:tc_log_async(error_logger, ?STD_IMPORTANCE, + ErrHeader, EReport, []) + end; true -> %% Report is an atom if no logging is to be done ignore end, diff --git a/lib/common_test/src/cth_surefire.erl b/lib/common_test/src/cth_surefire.erl index 74a97fe2e2..59b916851e 100644 --- a/lib/common_test/src/cth_surefire.erl +++ b/lib/common_test/src/cth_surefire.erl @@ -82,7 +82,8 @@ init(Path, Opts) -> url_base = proplists:get_value(url_base,Opts), timer = ?now }. -pre_init_per_suite(Suite,SkipOrFail,State) when is_tuple(SkipOrFail) -> +pre_init_per_suite(Suite,SkipOrFail,#state{ test_cases = [] } = State) + when is_tuple(SkipOrFail) -> {SkipOrFail, init_tc(State#state{curr_suite = Suite, curr_suite_ts = ?now}, SkipOrFail) }; diff --git a/lib/common_test/src/test_server.erl b/lib/common_test/src/test_server.erl index 34acad6fd1..919526c5d7 100644 --- a/lib/common_test/src/test_server.erl +++ b/lib/common_test/src/test_server.erl @@ -2165,10 +2165,19 @@ get_timetrap_info(TCPid, SendToServer) -> Timers -> case [Info || {Handle,Pid,Info} <- Timers, Pid == TCPid, Handle /= infinity] of - [I|_] -> - I; + [{TVal,true}|_] -> + {TVal,{true,test_server:timetrap_scale_factor()}}; + [{TVal,false}|_] -> + {TVal,{false,1}}; [] when SendToServer == true -> - tc_supervisor_req({get_timetrap_info,TCPid}); + case tc_supervisor_req({get_timetrap_info,TCPid}) of + {TVal,true} -> + {TVal,{true,test_server:timetrap_scale_factor()}}; + {TVal,false} -> + {TVal,{false,1}}; + Error -> + Error + end; [] -> undefined end diff --git a/lib/common_test/src/test_server_gl.erl b/lib/common_test/src/test_server_gl.erl index c150570604..333c8fc06e 100644 --- a/lib/common_test/src/test_server_gl.erl +++ b/lib/common_test/src/test_server_gl.erl @@ -131,6 +131,10 @@ set_props(GL, PropList) -> %%% Internal functions. init([]) -> + EscChars = case application:get_env(test_server, esc_chars) of + {ok,ECBool} -> ECBool; + _ -> true + end, {ok,#st{tc_supervisor=none, minor=none, minor_monitor=none, @@ -139,7 +143,7 @@ init([]) -> permit_io=gb_sets:empty(), auto_nl=true, levels={1,19,10}, - escape_chars=true + escape_chars=EscChars }}. req(GL, Req) -> diff --git a/lib/common_test/src/unix_telnet.erl b/lib/common_test/src/unix_telnet.erl index cd493d293f..4897ddb2f8 100644 --- a/lib/common_test/src/unix_telnet.erl +++ b/lib/common_test/src/unix_telnet.erl @@ -27,7 +27,8 @@ %%% {port,PortNum}, % optional %%% {username,UserName}, %%% {password,Password}, -%%% {keep_alive,Bool}]}. % optional</pre> +%%% {keep_alive,Bool}, % optional +%%% {tcp_nodely,Bool}]} % optional</pre> %%% %%% <p>To communicate via telnet to the host specified by %%% <code>HostNameOrIpAddress</code>, use the interface functions in @@ -55,7 +56,7 @@ -compile(export_all). %% Callbacks for ct_telnet.erl --export([connect/6,get_prompt_regexp/0]). +-export([connect/7,get_prompt_regexp/0]). -import(ct_telnet,[start_gen_log/1,log/4,end_gen_log/0]). -define(username,"login: "). @@ -82,6 +83,7 @@ get_prompt_regexp() -> %%% Port = integer() %%% Timeout = integer() %%% KeepAlive = bool() +%%% TCPNoDelay = bool() %%% Extra = ct:target_name() | {Username,Password} %%% Username = string() %%% Password = string() @@ -91,25 +93,25 @@ get_prompt_regexp() -> %%% @doc Callback for ct_telnet.erl. %%% %%% <p>Setup telnet connection to a unix host.</p> -connect(ConnName,Ip,Port,Timeout,KeepAlive,Extra) -> +connect(ConnName,Ip,Port,Timeout,KeepAlive,TCPNoDelay,Extra) -> case Extra of {Username,Password} -> - connect1(ConnName,Ip,Port,Timeout,KeepAlive, + connect1(ConnName,Ip,Port,Timeout,KeepAlive,TCPNoDelay, Username,Password); KeyOrName -> case get_username_and_password(KeyOrName) of {ok,{Username,Password}} -> - connect1(ConnName,Ip,Port,Timeout,KeepAlive, + connect1(ConnName,Ip,Port,Timeout,KeepAlive,TCPNoDelay, Username,Password); Error -> Error end end. -connect1(Name,Ip,Port,Timeout,KeepAlive,Username,Password) -> +connect1(Name,Ip,Port,Timeout,KeepAlive,TCPNoDelay,Username,Password) -> start_gen_log("unix_telnet connect"), Result = - case ct_telnet_client:open(Ip,Port,Timeout,KeepAlive,Name) of + case ct_telnet_client:open(Ip,Port,Timeout,KeepAlive,TCPNoDelay,Name) of {ok,Pid} -> case ct_telnet:silent_teln_expect(Name,Pid,[], [prompt],?prx,[]) of diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl index a281ddc938..20f139bcc8 100644 --- a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl +++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl @@ -1,8 +1,8 @@ -%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
-%%
+%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2010-2016. All Rights Reserved. +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,46 +14,46 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%%
-%% %CopyrightEnd%
-%%
-
--module(ct_update_config_SUITE).
-
--suite_defaults([{timetrap, {minutes, 10}}]).
-
-%% Note: This directive should only be used in test suites.
--compile(export_all).
-
--include("ct.hrl").
-
--define(now, os:timestamp()).
-
-%% Test server callback functions
-init_per_suite(Config) ->
- [{init_per_suite,?now}|Config].
-
-end_per_suite(_Config) ->
- ok.
-
-init_per_testcase(_TestCase, Config) ->
- [{init_per_testcase,?now}|Config].
-
-end_per_testcase(_TestCase, _Config) ->
- ok.
-
-init_per_group(GroupName, Config) ->
- [{init_per_group,?now}|Config].
-
-end_per_group(GroupName, Config) ->
- ok.
-
-all() ->
- [{group,group1}].
-
-groups() ->
- [{group1,[],[test_case]}].
-
-%% Test cases starts here.
-test_case(Config) when is_list(Config) ->
- ok.
+%% +%% %CopyrightEnd% +%% + +-module(ct_update_config_SUITE). + +-suite_defaults([{timetrap, {minutes, 10}}]). + +%% Note: This directive should only be used in test suites. +-compile(export_all). + +-include("ct.hrl"). + +-define(now, ct_test_support:unique_timestamp()). + +%% Test server callback functions +init_per_suite(Config) -> + [{init_per_suite,?now}|Config]. + +end_per_suite(_Config) -> + ok. + +init_per_testcase(_TestCase, Config) -> + [{init_per_testcase,?now}|Config]. + +end_per_testcase(_TestCase, _Config) -> + ok. + +init_per_group(GroupName, Config) -> + [{init_per_group,?now}|Config]. + +end_per_group(GroupName, Config) -> + ok. + +all() -> + [{group,group1}]. + +groups() -> + [{group1,[],[test_case]}]. + +%% Test cases starts here. +test_case(Config) when is_list(Config) -> + ok. diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl index dc0056b61b..c00eb5cf93 100644 --- a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl +++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl @@ -90,7 +90,7 @@ id(Opts) -> gen_event:notify(?CT_EVMGR_REF, #event{ name = cth, node = node(), data = {?MODULE, id, [Opts]}}), ct:log("~w:id called", [?MODULE]), - os:timestamp(). + ct_test_support:unique_timestamp(). %% @doc Called before init_per_suite is called. Note that this callback is %% only called if the CTH is added before init_per_suite is run (eg. in a test diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl index 02f7fa7564..d48981f667 100644 --- a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl +++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl @@ -25,7 +25,7 @@ -include_lib("common_test/src/ct_util.hrl"). -include_lib("common_test/include/ct_event.hrl"). --define(now, os:timestamp()). +-define(now, ct_test_support:unique_timestamp()). %% CT Hooks -compile(export_all). diff --git a/lib/common_test/test/ct_netconfc_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE.erl index 72c1de4023..03fbc17bd2 100644 --- a/lib/common_test/test/ct_netconfc_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE.erl @@ -48,7 +48,12 @@ init_per_suite(Config) -> {error,Reason} when Reason=/={already_loaded,crypto} -> {skip, Reason}; _ -> - ct_test_support:init_per_suite(Config) + case application:load(ssh) of + {error,Reason} when Reason=/={already_loaded,ssh} -> + {skip, Reason}; + _ -> + ct_test_support:init_per_suite(Config) + end end. end_per_suite(Config) -> diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl index e4062a7d62..065639dd36 100644 --- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl @@ -123,15 +123,21 @@ init_per_testcase(_Case, Config) -> end_per_testcase(_Case, _Config) -> ok. +init_per_suite() -> + [{timetrap,2*?default_timeout}]. % making dsa files can be slow init_per_suite(Config) -> - case catch {crypto:start(), ssh:start()} of - {ok, ok} -> + case catch ssh:start() of + Ok when Ok==ok; Ok=={error,{already_started,ssh}} -> + ct:log("ssh started",[]), {ok, _} = netconfc_test_lib:get_id_keys(Config), netconfc_test_lib:make_dsa_files(Config), + ct:log("dsa files created",[]), Server = ?NS:start(?config(data_dir,Config)), + ct:log("netconf server started",[]), [{server,Server}|Config]; - _ -> - {skip, "Crypto and/or SSH could not be started!"} + Other -> + ct:log("could not start ssh: ~p",[Other]), + {skip, "SSH could not be started!"} end. end_per_suite(Config) -> @@ -806,7 +812,7 @@ close_while_waiting_for_chunked_data(Config) -> %% Order server to expect a get - then the process above will make %% sure the rpc-reply is sent - but only a part of it - then close. ?NS:expect('get'), - {error,closed} = ct_netconfc:get(Client,{server,[{xmlns,"myns"}],[]},2000), + {error,closed} = ct_netconfc:get(Client,{server,[{xmlns,"myns"}],[]},4000), ok. connection_crash(Config) -> diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl index ae9087ce45..04bfe75187 100644 --- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl @@ -26,7 +26,8 @@ -compile(export_all). suite() -> - [{ct_hooks, [{cth_conn_log,[{ct_netconfc,[{log_type,html}]}]}]}]. + [{timetrap,?default_timeout}, + {ct_hooks, [{cth_conn_log,[{ct_netconfc,[{log_type,html}]}]}]}]. all() -> case os:find_executable("ssh") of @@ -48,13 +49,10 @@ end_per_group(_GroupName, Config) -> init_per_testcase(Case, Config) -> stop_node(Case), - Dog = test_server:timetrap(?default_timeout), - [{watchdog, Dog}|Config]. + Config. end_per_testcase(Case, Config) -> stop_node(Case), - Dog=?config(watchdog, Config), - test_server:timetrap_cancel(Dog), ok. stop_node(Case) -> @@ -63,14 +61,19 @@ stop_node(Case) -> rpc:call(Node,erlang,halt,[]). +init_per_suite() -> + [{timetrap,2*?default_timeout}]. % making dsa files can be slow init_per_suite(Config) -> - case {crypto:start(),ssh:start()} of - {ok,ok} -> + case ssh:start() of + Ok when Ok==ok; Ok=={error,{already_started,ssh}} -> + ct:log("SSH started locally",[]), {ok, _} = netconfc_test_lib:get_id_keys(Config), netconfc_test_lib:make_dsa_files(Config), + ct:log("dsa files created",[]), Config; - _ -> - {skip, "Crypto and/or SSH could not be started locally!"} + Other -> + ct:log("could not start ssh locally: ~p",[Other]), + {skip, "SSH could not be started locally!"} end. end_per_suite(Config) -> @@ -87,12 +90,15 @@ remote_crash(Config) -> Pa = filename:dirname(code:which(?NS)), true = rpc:call(Node,code,add_patha,[Pa]), - case {rpc:call(Node,crypto,start,[]),rpc:call(Node,ssh,start,[])} of - {ok,ok} -> + case rpc:call(Node,ssh,start,[]) of + Ok when Ok==ok; Ok=={error,{already_started,ssh}} -> + ct:log("SSH started remote",[]), Server = rpc:call(Node,?NS,start,[?config(data_dir,Config)]), + ct:log("netconf server started remote",[]), remote_crash(Node,Config); - _ -> - {skip, "Crypto and/or SSH could not be started remote!"} + Other -> + ct:log("could not start ssh remote: ~p",[Other]), + {skip, "SSH could not be started remote!"} end. remote_crash(Node,Config) -> diff --git a/lib/common_test/test/ct_pre_post_test_io_SUITE.erl b/lib/common_test/test/ct_pre_post_test_io_SUITE.erl index 74ef3a26ce..7ffe6f045b 100644 --- a/lib/common_test/test/ct_pre_post_test_io_SUITE.erl +++ b/lib/common_test/test/ct_pre_post_test_io_SUITE.erl @@ -44,13 +44,29 @@ %% instance, the tests need to be performed on a separate node (or %% there will be clashes with logging processes etc). %%-------------------------------------------------------------------- +suite() -> + [{ct_hooks,[ts_install_cth]}, + {timetrap,{seconds,120}}]. + +all() -> + [ + pre_post_io + ]. + init_per_suite(Config) -> - DataDir = ?config(data_dir, Config), - CTH = filename:join(DataDir, "cth_ctrl.erl"), - ct:pal("Compiling ~p: ~p", - [CTH,compile:file(CTH,[{outdir,DataDir},debug_info])]), - ct_test_support:init_per_suite([{path_dirs,[DataDir]}, - {start_sasl,true} | Config]). + TTInfo = {_T,{_Scaled,ScaleVal}} = ct:get_timetrap_info(), + ct:pal("Timetrap info = ~w", [TTInfo]), + if ScaleVal > 1 -> + {skip,"Skip on systems running e.g. cover or debug!"}; + ScaleVal =< 1 -> + DataDir = ?config(data_dir, Config), + CTH = filename:join(DataDir, "cth_ctrl.erl"), + ct:pal("Compiling ~p: ~p", + [CTH,compile:file(CTH,[{outdir,DataDir}, + debug_info])]), + ct_test_support:init_per_suite([{path_dirs,[DataDir]}, + {start_sasl,true} | Config]) + end. end_per_suite(Config) -> ct_test_support:end_per_suite(Config). @@ -61,13 +77,6 @@ init_per_testcase(TestCase, Config) -> end_per_testcase(TestCase, Config) -> ct_test_support:end_per_testcase(TestCase, Config). -suite() -> [{ct_hooks,[ts_install_cth]}]. - -all() -> - [ - pre_post_io - ]. - %%-------------------------------------------------------------------- %% TEST CASES %%-------------------------------------------------------------------- @@ -90,31 +99,50 @@ pre_post_io(Config) -> %%!-------------------------------------------------------------------- spawn(fun() -> - ct:pal("CONTROLLER: Started!", []), + ct:pal("CONTROLLER: Starting test run #1...", []), %% --- test run 1 --- - ct:sleep(3000), - ct:pal("CONTROLLER: Handle remote events = true", []), - ok = ct_test_support:ct_rpc({cth_log_redirect, - handle_remote_events, - [true]}, Config), - ct:sleep(2000), - ct:pal("CONTROLLER: Proceeding with test run #1!", []), + try_loop(ct_test_support, ct_rpc, [{cth_log_redirect, + handle_remote_events, + [true]}, Config], 3000), + CTLoggerPid1 = ct_test_support:ct_rpc({erlang,whereis, + [ct_logs]}, Config), + ct:pal("CONTROLLER: Logger = ~w~nHandle remote events = true", + [CTLoggerPid1]), + ct:sleep(5000), + ct:pal("CONTROLLER: Proceeding with test run #1...", []), ok = ct_test_support:ct_rpc({cth_ctrl,proceed,[]}, Config), ct:sleep(6000), - ct:pal("CONTROLLER: Proceeding with shutdown #1!", []), + ct:pal("CONTROLLER: Proceeding with shutdown #1...", []), ok = ct_test_support:ct_rpc({cth_ctrl,proceed,[]}, Config), + try_loop(fun() -> + false = ct_test_support:ct_rpc({erlang, + is_process_alive, + [CTLoggerPid1]}, + Config) + end, 3000), + ct:pal("CONTROLLER: Shutdown #1 complete!", []), + ct:pal("CONTROLLER: Starting test run #2...", []), %% --- test run 2 --- - ct:sleep(3000), - ct:pal("CONTROLLER: Handle remote events = true", []), - ok = ct_test_support:ct_rpc({cth_log_redirect, - handle_remote_events, - [true]}, Config), - ct:sleep(2000), - ct:pal("CONTROLLER: Proceeding with test run #2!", []), + try_loop(ct_test_support, ct_rpc, [{cth_log_redirect, + handle_remote_events, + [true]}, Config], 3000), + CTLoggerPid2 = ct_test_support:ct_rpc({erlang,whereis, + [ct_logs]}, Config), + ct:pal("CONTROLLER: Logger = ~w~nHandle remote events = true", + [CTLoggerPid2]), + ct:sleep(5000), + ct:pal("CONTROLLER: Proceeding with test run #2...", []), ok = ct_test_support:ct_rpc({cth_ctrl,proceed,[]}, Config), ct:sleep(6000), - ct:pal("CONTROLLER: Proceeding with shutdown #2!", []), - ok = ct_test_support:ct_rpc({cth_ctrl,proceed,[]}, Config) + ct:pal("CONTROLLER: Proceeding with shutdown #2...", []), + ok = ct_test_support:ct_rpc({cth_ctrl,proceed,[]}, Config), + try_loop(fun() -> + false = ct_test_support:ct_rpc({erlang, + is_process_alive, + [CTLoggerPid2]}, + Config) + end, 3000), + ct:pal("CONTROLLER: Shutdown #2 complete!", []) end), ct_test_support:run(Opts, Config), Events = ct_test_support:get_events(ERPid, Config), @@ -157,7 +185,7 @@ pre_post_io(Config) -> Counters end, {pre,0,0,0,0}, Ts), [_|Counters] = tuple_to_list(PrePostIOEntries), - ct:log("Entries in the Pre/Post Test IO Log: ~p", [Counters]), + ct:pal("Entries in the Pre/Post Test IO Log: ~w", [Counters]), case [C || C <- Counters, C < 2] of [] -> ok; @@ -183,7 +211,7 @@ pre_post_io(Config) -> [LogN,ErrN+1]; (_, Counters) -> Counters end, [0,0], Ts), - ct:log("Entries in the Unexpected IO Log: ~p", [UnexpIOEntries]), + ct:log("Entries in the Unexpected IO Log: ~w", [UnexpIOEntries]), case [N || N <- UnexpIOEntries, N < 2] of [] -> ok; @@ -208,6 +236,38 @@ setup(Test, Config) -> reformat(Events, EH) -> ct_test_support:reformat(Events, EH). +try_loop(_Fun, 0) -> + ct:pal("WARNING! Fun never succeeded!", []), + gave_up; +try_loop(Fun, N) -> + try Fun() of + {error,_} -> + timer:sleep(10), + try_loop(Fun, N-1); + Result -> + Result + catch + _:_What -> + timer:sleep(10), + try_loop(Fun, N-1) + end. + +try_loop(M, F, _A, 0) -> + ct:pal("WARNING! ~w:~w never succeeded!", [M,F]), + gave_up; +try_loop(M, F, A, N) -> + try apply(M, F, A) of + {error,_} -> + timer:sleep(10), + try_loop(M, F, A, N-1); + Result -> + Result + catch + _:_ -> + timer:sleep(10), + try_loop(M, F, A, N-1) + end. + %%%----------------------------------------------------------------- %%% TEST EVENTS %%%----------------------------------------------------------------- diff --git a/lib/common_test/test/ct_pre_post_test_io_SUITE_data/cth_ctrl.erl b/lib/common_test/test/ct_pre_post_test_io_SUITE_data/cth_ctrl.erl index cb0c5ed14e..347b507c78 100644 --- a/lib/common_test/test/ct_pre_post_test_io_SUITE_data/cth_ctrl.erl +++ b/lib/common_test/test/ct_pre_post_test_io_SUITE_data/cth_ctrl.erl @@ -53,8 +53,7 @@ init(_Id, _Opts) -> receive {?MODULE,proceed} -> ok after - 10000 -> - ok + 10000 -> ok end, {ok,[],ct_last}. @@ -66,8 +65,7 @@ terminate(_State) -> receive {?MODULE,proceed} -> ok after - 10000 -> - ok + 10000 -> ok end, stop_external_logger(cth_logger), stop_dispatcher(), @@ -94,7 +92,7 @@ init_logger(Name) -> logger_loop(N) -> ct:log("Logger iteration: ~p", [N]), error_logger:error_report(N), - timer:sleep(250), + timer:sleep(100), logger_loop(N+1). %%%----------------------------------------------------------------- diff --git a/lib/common_test/test/ct_surefire_SUITE.erl b/lib/common_test/test/ct_surefire_SUITE.erl index a39a3887f7..42ec685c16 100644 --- a/lib/common_test/test/ct_surefire_SUITE.erl +++ b/lib/common_test/test/ct_surefire_SUITE.erl @@ -49,8 +49,11 @@ %% there will be clashes with logging processes etc). %%-------------------------------------------------------------------- init_per_suite(Config) -> - Config1 = ct_test_support:init_per_suite(Config), - Config1. + DataDir = ?config(data_dir,Config), + Hook = "fail_pre_init_per_suite.erl", + io:format("Compiling ~p: ~p~n", + [Hook, compile:file(Hook,[{outdir,DataDir},debug_info])]), + ct_test_support:init_per_suite([{path_dirs,[DataDir]}|Config]). end_per_suite(Config) -> ct_test_support:end_per_suite(Config). @@ -69,7 +72,8 @@ all() -> absolute_path, relative_path, url, - logdir + logdir, + fail_pre_init_per_suite ]. %%-------------------------------------------------------------------- @@ -107,6 +111,14 @@ logdir(Config) when is_list(Config) -> Path = "logdir.xml", run(logdir,[{cth_surefire,[{path,Path}]}],Path,Config,[{logdir,MyLogDir}]). +fail_pre_init_per_suite(Config) when is_list(Config) -> + DataDir = ?config(data_dir,Config), + Suites = [filename:join(DataDir,"pass_SUITE"), + filename:join(DataDir,"fail_SUITE")], + Path = "fail_pre_init_per_suite.xml", + run(fail_pre_init_per_suite,[fail_pre_init_per_suite, + {cth_surefire,[{path,Path}]}],Path,Config,[],Suites). + %%%----------------------------------------------------------------- %%% HELP FUNCTIONS %%%----------------------------------------------------------------- @@ -115,6 +127,8 @@ run(Case,CTHs,Report,Config) -> run(Case,CTHs,Report,Config,ExtraOpts) -> DataDir = ?config(data_dir, Config), Suite = filename:join(DataDir, "surefire_SUITE"), + run(Case,CTHs,Report,Config,ExtraOpts,Suite). +run(Case,CTHs,Report,Config,ExtraOpts,Suite) -> {Opts,ERPid} = setup([{suite,Suite},{ct_hooks,CTHs},{label,Case}|ExtraOpts], Config), ok = execute(Case, Opts, ERPid, Config), @@ -142,7 +156,6 @@ setup(Test, Config) -> execute(Name, Opts, ERPid, Config) -> ok = ct_test_support:run(Opts, Config), Events = ct_test_support:get_events(ERPid, Config), - ct_test_support:log_events(Name, reformat(Events, ?eh), ?config(priv_dir, Config), @@ -166,10 +179,30 @@ events_to_check(_, 0) -> events_to_check(Test, N) -> test_events(Test) ++ events_to_check(Test, N-1). -test_events(_) -> - [{?eh,start_logging,'_'}, - {?eh,start_info,{1,1,9}}, - {?eh,tc_start,{surefire_SUITE,init_per_suite}}, +test_suite_events(fail_SUITE, TestStat) -> + [{?eh,tc_start,{ct_framework,init_per_suite}}, + {?eh,tc_done,{ct_framework,init_per_suite, + {failed,{error,pre_init_per_suite}}}}, + {?eh,tc_auto_skip, + {fail_SUITE,test_case, + {failed,{ct_framework,init_per_suite,{failed,pre_init_per_suite}}}}}, + {?eh,test_stats,TestStat}, + {?eh,tc_auto_skip, + {ct_framework,end_per_suite, + {failed,{ct_framework,init_per_suite,{failed,pre_init_per_suite}}}}}]. + +test_suite_events(fail_SUITE) -> + test_suite_events(fail_SUITE, {0,0,{0,1}}); +test_suite_events(pass_SUITE) -> + [{?eh,tc_start,{ct_framework,init_per_suite}}, + {?eh,tc_done,{ct_framework,init_per_suite,ok}}, + {?eh,tc_start,{pass_SUITE,test_case}}, + {?eh,tc_done,{pass_SUITE,test_case,ok}}, + {?eh,test_stats,{1,0,{0,0}}}, + {?eh,tc_start,{ct_framework,end_per_suite}}, + {?eh,tc_done,{ct_framework,end_per_suite,ok}}]; +test_suite_events(_) -> + [{?eh,tc_start,{surefire_SUITE,init_per_suite}}, {?eh,tc_done,{surefire_SUITE,init_per_suite,ok}}, {?eh,tc_start,{surefire_SUITE,tc_ok}}, {?eh,tc_done,{surefire_SUITE,tc_ok,ok}}, @@ -216,9 +249,18 @@ test_events(_) -> {surefire_SUITE,init_per_group, {'EXIT',all_cases_should_be_skipped}}}}}], {?eh,tc_start,{surefire_SUITE,end_per_suite}}, - {?eh,tc_done,{surefire_SUITE,end_per_suite,ok}}, - {?eh,stop_logging,[]}]. - + {?eh,tc_done,{surefire_SUITE,end_per_suite,ok}}]. + +test_events(fail_pre_init_per_suite) -> + [{?eh,start_logging,{'DEF','RUNDIR'}}, + {?eh,start_info,{2,2,2}}] ++ + test_suite_events(pass_SUITE) ++ + test_suite_events(fail_SUITE, {1,0,{0,1}}) ++ + [{?eh,stop_logging,[]}]; +test_events(Test) -> + [{?eh,start_logging,'_'}, {?eh,start_info,{1,1,9}}] ++ + test_suite_events(Test) ++ + [{?eh,stop_logging,[]}]. %%%----------------------------------------------------------------- %%% Check generated xml log files @@ -251,9 +293,9 @@ do_check_xml(Case,[Xml|Xmls]) -> {E,_} = xmerl_scan:file(Xml), Expected = events_to_result(lists:flatten(test_events(Case))), ParseResult = testsuites(Case,E), - ct:log("Expecting: ~p~n",[[Expected]]), + ct:log("Expecting: ~p~n",[Expected]), ct:log("Actual : ~p~n",[ParseResult]), - [Expected] = ParseResult, + Expected = ParseResult, do_check_xml(Case,Xmls); do_check_xml(_,[]) -> ok. @@ -265,7 +307,8 @@ testsuites(Case,#xmlElement{name=testsuites,content=TS}) -> testsuite(Case,TS). testsuite(Case,[#xmlElement{name=testsuite,content=TC,attributes=A}|TS]) -> - {ET,EF,ES} = events_to_numbers(lists:flatten(test_events(Case))), + TestSuiteEvents = test_suite_events(get_ts_name(A)), + {ET,EF,ES} = events_to_numbers(lists:flatten(TestSuiteEvents)), {T,E,F,S} = get_numbers_from_attrs(A,false,false,false,false), ct:log("Expecting total:~p, error:~p, failure:~p, skipped:~p~n",[ET,0,EF,ES]), ct:log("Actual total:~p, error:~p, failure:~p, skipped:~p~n",[T,E,F,S]), @@ -318,14 +361,32 @@ failed_or_skipped([]) -> %% Testsuites = [Testsuite] %% Testsuite = [Testcase] %% Testcase = [] | [f] | [s], indicating ok, failed and skipped respectively -events_to_result([{?eh,tc_done,{_Suite,_Case,R}}|E]) -> - [result(R)|events_to_result(E)]; -events_to_result([{?eh,tc_auto_skip,_}|E]) -> - [[s]|events_to_result(E)]; -events_to_result([_|E]) -> - events_to_result(E); -events_to_result([]) -> - []. +events_to_result(E) -> + events_to_result(E, []). + +events_to_result([{?eh,tc_auto_skip,{_Suite,init_per_suite,_}}|E], Result) -> + {Suite,Rest} = events_to_result1(E), + events_to_result(Rest, [[[s]|Suite]|Result]); +events_to_result([{?eh,tc_done,{_Suite,init_per_suite,R}}|E], Result) -> + {Suite,Rest} = events_to_result1(E), + events_to_result(Rest, [[result(R)|Suite]|Result]); +events_to_result([_|E], Result) -> + events_to_result(E, Result); +events_to_result([], Result) -> + Result. + +events_to_result1([{?eh,tc_auto_skip,{_Suite, end_per_suite,_}}|E]) -> + {[[s]],E}; +events_to_result1([{?eh,tc_done,{_Suite, end_per_suite,R}}|E]) -> + {[result(R)],E}; +events_to_result1([{?eh,tc_done,{_Suite,_Case,R}}|E]) -> + {Suite,Rest} = events_to_result1(E), + {[result(R)|Suite],Rest}; +events_to_result1([{?eh,tc_auto_skip,_}|E]) -> + {Suite,Rest} = events_to_result1(E), + {[[s]|Suite],Rest}; +events_to_result1([_|E]) -> + events_to_result1(E). result(ok) ->[]; result({skipped,_}) -> [s]; @@ -374,3 +435,7 @@ del_files(Dir,[F0|Fs] ) -> end; del_files(_,[]) -> ok. + +get_ts_name(Attributes) -> + {_,name,_,_,_,_,_,_,Name,_} = lists:keyfind(name, 2, Attributes), + list_to_atom(Name). diff --git a/lib/common_test/test/ct_surefire_SUITE_data/fail_SUITE.erl b/lib/common_test/test/ct_surefire_SUITE_data/fail_SUITE.erl new file mode 100644 index 0000000000..3f5f42c054 --- /dev/null +++ b/lib/common_test/test/ct_surefire_SUITE_data/fail_SUITE.erl @@ -0,0 +1,28 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(fail_SUITE). +-include_lib("common_test/include/ct.hrl"). + +-export([all/0, test_case/1]). + +all() -> + [test_case]. + +test_case(_Config) -> + ok. diff --git a/lib/common_test/test/ct_surefire_SUITE_data/fail_pre_init_per_suite.erl b/lib/common_test/test/ct_surefire_SUITE_data/fail_pre_init_per_suite.erl new file mode 100644 index 0000000000..ff278db378 --- /dev/null +++ b/lib/common_test/test/ct_surefire_SUITE_data/fail_pre_init_per_suite.erl @@ -0,0 +1,47 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +%%% This tests that the correct XML is produced when pre_init_per_suite +%%% fails in a hook +-module(fail_pre_init_per_suite). + +%% CT Hooks +-export([init/2, pre_init_per_suite/3]). + +-type config() :: proplists:proplist(). +-type reason() :: term(). +-type skip_or_fail() :: skip | auto_skip | fail | 'EXIT'. + +-record(state, {}). + +-spec init(Id :: term(), Opts :: proplists:proplist()) -> + {ok, proplists:proplist()}. +init(_Id, Opts) -> + {ok, Opts}. + +-spec pre_init_per_suite(Suite :: atom(), + Config :: config(), + State :: #state{}) -> + {config() | {skip_or_fail(), reason()}, NewState :: #state{}}. +pre_init_per_suite(fail_SUITE, _Config, State) -> + {{fail, pre_init_per_suite}, State}; +pre_init_per_suite(_Suite, Config, State) -> + {Config, State}. + diff --git a/lib/common_test/test/ct_surefire_SUITE_data/pass_SUITE.erl b/lib/common_test/test/ct_surefire_SUITE_data/pass_SUITE.erl new file mode 100644 index 0000000000..74ed5b730e --- /dev/null +++ b/lib/common_test/test/ct_surefire_SUITE_data/pass_SUITE.erl @@ -0,0 +1,28 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(pass_SUITE). +-include_lib("common_test/include/ct.hrl"). + +-export([all/0, test_case/1]). + +all() -> + [test_case]. + +test_case(_Config) -> + ok. diff --git a/lib/common_test/test/ct_test_support.erl b/lib/common_test/test/ct_test_support.erl index 51ca691d69..477fcb8a26 100644 --- a/lib/common_test/test/ct_test_support.erl +++ b/lib/common_test/test/ct_test_support.erl @@ -43,6 +43,8 @@ -export([random_error/1]). +-export([unique_timestamp/0]). + -include_lib("kernel/include/file.hrl"). %%%----------------------------------------------------------------- @@ -110,7 +112,8 @@ start_slave(NodeName, Config, Level) -> undefined -> []; Ds -> Ds end, - PathDirs = [PrivDir,TSDir | AddPathDirs], + TestSupDir = filename:dirname(code:which(?MODULE)), + PathDirs = [PrivDir,TSDir,TestSupDir | AddPathDirs], [true = rpc:call(CTNode, code, add_patha, [D]) || D <- PathDirs], test_server:format(Level, "Dirs added to code path (on ~w):~n", [CTNode]), @@ -1430,7 +1433,21 @@ rm_files([F | Fs]) -> end; rm_files([]) -> ok. - + +unique_timestamp() -> + unique_timestamp(os:timestamp(), 100000). + +unique_timestamp(TS, 0) -> + TS; +unique_timestamp(TS0, N) -> + case os:timestamp() of + TS0 -> + timer:sleep(1), + unique_timestamp(TS0, N-1); + TS1 -> + TS1 + end. + %%%----------------------------------------------------------------- %%% slave_stop(Node) -> diff --git a/lib/compiler/src/v3_kernel.erl b/lib/compiler/src/v3_kernel.erl index 4a6330fce4..402e3c4912 100644 --- a/lib/compiler/src/v3_kernel.erl +++ b/lib/compiler/src/v3_kernel.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2015. All Rights Reserved. +%% Copyright Ericsson AB 1999-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -147,6 +147,7 @@ include_attribute(callback) -> false; include_attribute(opaque) -> false; include_attribute(export_type) -> false; include_attribute(record) -> false; +include_attribute(optional_callbacks) -> false; include_attribute(_) -> true. function({#c_var{name={F,Arity}=FA},Body}, St0) -> diff --git a/lib/dialyzer/README b/lib/dialyzer/README index 82d0f5ec48..951a92469b 100644 --- a/lib/dialyzer/README +++ b/lib/dialyzer/README @@ -6,7 +6,7 @@ ## Copyright: Held by the authors; all rights reserved (2004 - 2010). ##---------------------------------------------------------------------------- -The DIALYZER, a DIscrepany AnaLYZer for ERlang programs. +The DIALYZER, a DIscrepancy AnaLYZer for ERlang programs. ----------------------------------------------- diff --git a/lib/dialyzer/doc/about.txt b/lib/dialyzer/doc/about.txt index 7d9d819731..1318d9a65e 100644 --- a/lib/dialyzer/doc/about.txt +++ b/lib/dialyzer/doc/about.txt @@ -1,5 +1,5 @@ This is DIALYZER version 2.1.0 - DIALYZER is a DIscrepany AnaLYZer for ERlang programs. + DIALYZER is a DIscrepancy AnaLYZer for ERlang programs. Copyright (C) Tobias Lindahl <[email protected]> Kostis Sagonas <[email protected]> diff --git a/lib/dialyzer/doc/manual.txt b/lib/dialyzer/doc/manual.txt index 29c9518d84..be1fd2f8bc 100644 --- a/lib/dialyzer/doc/manual.txt +++ b/lib/dialyzer/doc/manual.txt @@ -4,7 +4,7 @@ ## Kostis Sagonas <[email protected]> ##---------------------------------------------------------------------------- -The DIALYZER, a DIscrepany AnaLYZer for ERlang programs. +The DIALYZER, a DIscrepancy AnaLYZer for ERlang programs. ----------------------------------------------- diff --git a/lib/dialyzer/info b/lib/dialyzer/info index 9fba4b54ad..b9ea26b712 100644 --- a/lib/dialyzer/info +++ b/lib/dialyzer/info @@ -1,2 +1,2 @@ group: tools -short: The DIALYZER, a DIscrepany AnaLYZer for ERlang programs. +short: The DIALYZER, a DIscrepancy AnaLYZer for ERlang programs. diff --git a/lib/dialyzer/src/dialyzer.app.src b/lib/dialyzer/src/dialyzer.app.src index 003d7f2ba4..5b28f7ae86 100644 --- a/lib/dialyzer/src/dialyzer.app.src +++ b/lib/dialyzer/src/dialyzer.app.src @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2015. All Rights Reserved. +%% Copyright Ericsson AB 2006-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -47,6 +47,6 @@ {registered, []}, {applications, [compiler, hipe, kernel, stdlib, wx]}, {env, []}, - {runtime_dependencies, ["wx-1.2","syntax_tools-1.6.14","stdlib-2.5", - "kernel-3.0","hipe-3.13","erts-7.0", - "compiler-5.0"]}]}. + {runtime_dependencies, ["wx-1.2","syntax_tools-2.0","stdlib-3.0", + "kernel-5.0","hipe-3.15.1","erts-8.0", + "compiler-7.0"]}]}. diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl index 1895a98e96..116260778c 100644 --- a/lib/dialyzer/src/dialyzer_contracts.erl +++ b/lib/dialyzer/src/dialyzer_contracts.erl @@ -210,10 +210,10 @@ check_contract(Contract, SuccType) -> check_contract(#contract{contracts = Contracts}, SuccType, Opaques) -> try - Contracts1 = [{Contract, insert_constraints(Constraints, dict:new())} + Contracts1 = [{Contract, insert_constraints(Constraints)} || {Contract, Constraints} <- Contracts], - Contracts2 = [erl_types:t_subst(Contract, Dict) - || {Contract, Dict} <- Contracts1], + Contracts2 = [erl_types:t_subst(Contract, Map) + || {Contract, Map} <- Contracts1], GenDomains = [erl_types:t_fun_args(C) || C <- Contracts2], case check_domains(GenDomains) of error -> @@ -344,15 +344,15 @@ process_contract({Contract, Constraints}, CallTypes0) -> [erl_types:t_to_string(ContArgsFun), erl_types:t_to_string(CallTypesFun)]), case solve_constraints(ContArgsFun, CallTypesFun, Constraints) of - {ok, VarDict} -> - {ok, erl_types:t_subst(erl_types:t_fun_range(Contract), VarDict)}; + {ok, VarMap} -> + {ok, erl_types:t_subst(erl_types:t_fun_range(Contract), VarMap)}; error -> error end. solve_constraints(Contract, Call, Constraints) -> %% First make sure the call follows the constraints - CDict = insert_constraints(Constraints, dict:new()), - Contract1 = erl_types:t_subst(Contract, CDict), + CMap = insert_constraints(Constraints), + Contract1 = erl_types:t_subst(Contract, CMap), %% Just a safe over-approximation. %% TODO: Find the types for type variables properly ContrArgs = erl_types:t_fun_args(Contract1), @@ -360,7 +360,7 @@ solve_constraints(Contract, Call, Constraints) -> InfList = erl_types:t_inf_lists(ContrArgs, CallArgs), case erl_types:any_none_or_unit(InfList) of true -> error; - false -> {ok, CDict} + false -> {ok, CMap} end. %%Inf = erl_types:t_inf(Contract1, Call), %% Then unify with the constrained call type. @@ -390,23 +390,26 @@ warn_spec_missing_fun({M, F, A} = MFA, Contracts) -> {?WARN_CONTRACT_SYNTAX, WarningInfo, {spec_missing_fun, [M, F, A]}}. %% This treats the "when" constraints. It will be extended, we hope. -insert_constraints([{subtype, Type1, Type2}|Left], Dict) -> +insert_constraints(Constraints) -> + insert_constraints(Constraints, maps:new()). + +insert_constraints([{subtype, Type1, Type2}|Left], Map) -> case erl_types:t_is_var(Type1) of true -> Name = erl_types:t_var_name(Type1), - Dict1 = case dict:find(Name, Dict) of - error -> - dict:store(Name, Type2, Dict); - {ok, VarType} -> - dict:store(Name, erl_types:t_inf(VarType, Type2), Dict) - end, - insert_constraints(Left, Dict1); + Map1 = case maps:find(Name, Map) of + error -> + maps:put(Name, Type2, Map); + {ok, VarType} -> + maps:put(Name, erl_types:t_inf(VarType, Type2), Map) + end, + insert_constraints(Left, Map1); false -> %% A lot of things should change to add supertypes throw({error, io_lib:format("First argument of is_subtype constraint " "must be a type variable: ~p\n", [Type1])}) end; -insert_constraints([], Dict) -> Dict. +insert_constraints([], Map) -> Map. -type types() :: erl_types:type_table(). @@ -476,7 +479,7 @@ initialize_constraints([], _MFA, _RecDict, _ExpTypes, _AllRecords, Acc) -> initialize_constraints([Constr|Rest], MFA, RecDict, ExpTypes, AllRecords, Acc) -> case Constr of {type, _, constraint, [{atom, _, is_subtype}, [Type1, Type2]]} -> - T1 = final_form(Type1, ExpTypes, MFA, AllRecords, dict:new()), + T1 = final_form(Type1, ExpTypes, MFA, AllRecords, maps:new()), Entry = {T1, Type2}, initialize_constraints(Rest, MFA, RecDict, ExpTypes, AllRecords, [Entry|Acc]); {type, _, constraint, [{atom,_,Name}, List]} -> @@ -487,7 +490,7 @@ initialize_constraints([Constr|Rest], MFA, RecDict, ExpTypes, AllRecords, Acc) - constraints_fixpoint(Constrs, MFA, RecDict, ExpTypes, AllRecords) -> VarDict = - constraints_to_dict(Constrs, MFA, RecDict, ExpTypes, AllRecords, dict:new()), + constraints_to_dict(Constrs, MFA, RecDict, ExpTypes, AllRecords, maps:new()), constraints_fixpoint(VarDict, MFA, Constrs, RecDict, ExpTypes, AllRecords). constraints_fixpoint(OldVarDict, MFA, Constrs, RecDict, ExpTypes, AllRecords) -> @@ -499,7 +502,7 @@ constraints_fixpoint(OldVarDict, MFA, Constrs, RecDict, ExpTypes, AllRecords) -> fun(Key, Value, Acc) -> [{subtype, erl_types:t_var(Key), Value}|Acc] end, - FinalConstrs = dict:fold(DictFold, [], NewVarDict), + FinalConstrs = maps:fold(DictFold, [], NewVarDict), {FinalConstrs, NewVarDict}; _Other -> constraints_fixpoint(NewVarDict, MFA, Constrs, RecDict, ExpTypes, AllRecords) @@ -509,7 +512,7 @@ final_form(Form, ExpTypes, MFA, AllRecords, VarDict) -> from_form_with_check(Form, ExpTypes, MFA, AllRecords, VarDict). from_form_with_check(Form, ExpTypes, MFA, AllRecords) -> - from_form_with_check(Form, ExpTypes, MFA, AllRecords, dict:new()). + from_form_with_check(Form, ExpTypes, MFA, AllRecords, maps:new()). from_form_with_check(Form, ExpTypes, MFA, AllRecords, VarDict) -> Site = {spec, MFA}, @@ -520,7 +523,7 @@ from_form_with_check(Form, ExpTypes, MFA, AllRecords, VarDict) -> constraints_to_dict(Constrs, MFA, RecDict, ExpTypes, AllRecords, VarDict) -> Subtypes = constraints_to_subs(Constrs, MFA, RecDict, ExpTypes, AllRecords, VarDict, []), - insert_constraints(Subtypes, dict:new()). + insert_constraints(Subtypes). constraints_to_subs([], _MFA, _RecDict, _ExpTypes, _AllRecords, _VarDict, Acc) -> Acc; @@ -605,8 +608,8 @@ general_domain(List) -> general_domain(List, erl_types:t_none()). general_domain([{Sig, Constraints}|Left], AccSig) -> - Dict = insert_constraints(Constraints, dict:new()), - Sig1 = erl_types:t_subst(Sig, Dict), + Map = insert_constraints(Constraints), + Sig1 = erl_types:t_subst(Sig, Map), general_domain(Left, erl_types:t_sup(AccSig, Sig1)); general_domain([], AccSig) -> %% Get rid of all variables in the domain. diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl index f0fa9fbb4e..5ab0c39c04 100644 --- a/lib/dialyzer/src/dialyzer_dataflow.erl +++ b/lib/dialyzer/src/dialyzer_dataflow.erl @@ -2,7 +2,7 @@ %%-------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2015. All Rights Reserved. +%% Copyright Ericsson AB 2006-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -43,7 +43,6 @@ -include("dialyzer.hrl"). -%%-import(helper, %% 'helper' could be any module doing sanity checks... -import(erl_types, [t_inf/2, t_inf/3, t_inf_lists/2, t_inf_lists/3, t_inf_lists/3, t_is_equal/2, t_is_subtype/2, t_subtract/2, @@ -126,8 +125,8 @@ curr_fun :: curr_fun() }). --record(map, {dict = dict:new() :: type_tab(), - subst = dict:new() :: subst_tab(), +-record(map, {map = maps:new() :: type_tab(), + subst = maps:new() :: subst_tab(), modified = [] :: [Key :: term()], modified_stack = [] :: [{[Key :: term()],reference()}], ref = undefined :: reference() | undefined}). @@ -135,10 +134,10 @@ -type env_tab() :: dict:dict(label(), #map{}). -type fun_entry() :: {Args :: [type()], RetType :: type()}. -type fun_tab() :: dict:dict('top' | label(), - {'not_handled', fun_entry()} | fun_entry()). + {'not_handled', fun_entry()} | fun_entry()). -type key() :: label() | cerl:cerl(). --type type_tab() :: dict:dict(key(), type()). --type subst_tab() :: dict:dict(key(), cerl:cerl()). +-type type_tab() :: #{key() => type()}. +-type subst_tab() :: #{key() => cerl:cerl()}. %% Exported Types @@ -1766,7 +1765,7 @@ bind_opaque_pats(GenType, Type, Pat, State) -> %% bind_guard(Guard, Map, State) -> - try bind_guard(Guard, Map, dict:new(), pos, State) of + try bind_guard(Guard, Map, maps:new(), pos, State) of {Map1, _Type} -> Map1 catch throw:{fail, Warning} -> {error, Warning}; @@ -1804,7 +1803,7 @@ bind_guard(Guard, Map, Env, Eval, State) -> catch throw:HE -> {{Map2, t_none()}, HE} end, - BodyEnv = dict:store(get_label(Var), Arg, Env), + BodyEnv = maps:put(get_label(Var), Arg, Env), Wanted = case Eval of pos -> t_atom(true); neg -> t_atom(false); dont_know -> t_any() end, case t_is_none(t_inf(HandlerType, Wanted)) of @@ -1850,7 +1849,7 @@ bind_guard(Guard, Map, Env, Eval, State) -> Arg = cerl:let_arg(Guard), [Var] = cerl:let_vars(Guard), %%?debug("Storing: ~w\n", [Var]), - NewEnv = dict:store(get_label(Var), Arg, Env), + NewEnv = maps:put(get_label(Var), Arg, Env), bind_guard(cerl:let_body(Guard), Map, NewEnv, Eval, State); values -> Es = cerl:values_es(Guard), @@ -1859,7 +1858,7 @@ bind_guard(Guard, Map, Env, Eval, State) -> {Map, Type}; var -> ?debug("Looking for var(~w)...", [cerl_trees:get_label(Guard)]), - case dict:find(get_label(Guard), Env) of + case maps:find(get_label(Guard), Env) of error -> ?debug("Did not find it\n", []), Type = lookup_type(Guard, Map), @@ -2689,10 +2688,10 @@ join_maps_end(Maps, MapOut) -> #map{ref = Ref, modified_stack = [{M1,R1} | S]} = MapOut, true = lists:all(fun(M) -> M#map.ref =:= Ref end, Maps), % sanity Keys0 = lists:usort(lists:append([M#map.modified || M <- Maps])), - #map{dict = Dict, subst = Subst} = MapOut, + #map{map = Map, subst = Subst} = MapOut, Keys = [Key || Key <- Keys0, - dict:is_key(Key, Dict) orelse dict:is_key(Key, Subst)], + maps:is_key(Key, Map) orelse maps:is_key(Key, Subst)], Out = case Maps of [] -> join_maps(Maps, MapOut); _ -> join_maps(Keys, Maps, MapOut) @@ -2703,8 +2702,8 @@ join_maps_end(Maps, MapOut) -> modified_stack = S}. join_maps(Maps, MapOut) -> - #map{dict = Dict, subst = Subst} = MapOut, - Keys = ordsets:from_list(dict:fetch_keys(Dict) ++ dict:fetch_keys(Subst)), + #map{map = Map, subst = Subst} = MapOut, + Keys = ordsets:from_list(maps:keys(Map) ++ maps:keys(Subst)), join_maps(Keys, Maps, MapOut). join_maps(Keys, Maps, MapOut) -> @@ -2733,11 +2732,11 @@ join_maps_one_key([], _Key, AccType) -> -ifdef(DEBUG). debug_join_check(Maps, MapOut, Out) -> - #map{dict = Dict, subst = Subst} = Out, - #map{dict = Dict2, subst = Subst2} = join_maps(Maps, MapOut), - F = fun(D) -> lists:keysort(1, dict:to_list(D)) end, + #map{map = Map, subst = Subst} = Out, + #map{map = Map2, subst = Subst2} = join_maps(Maps, MapOut), + F = fun(D) -> lists:keysort(1, maps:to_list(D)) end, [throw({bug, join_maps}) || - F(Dict) =/= F(Dict2) orelse F(Subst) =/= F(Subst2)]. + F(Map) =/= F(Map2) orelse F(Subst) =/= F(Subst2)]. -else. debug_join_check(_Maps, _MapOut, _Out) -> ok. -endif. @@ -2768,15 +2767,15 @@ enter_type(Key, Val, MS) -> enter_type_lists(Keys, t_to_tlist(Val), MS) end; false -> - #map{dict = Dict, subst = Subst} = MS, + #map{map = Map, subst = Subst} = MS, KeyLabel = get_label(Key), - case dict:find(KeyLabel, Subst) of + case maps:find(KeyLabel, Subst) of {ok, NewKey} -> ?debug("Binding ~p to ~p\n", [KeyLabel, NewKey]), enter_type(NewKey, Val, MS); error -> ?debug("Entering ~p :: ~s\n", [KeyLabel, t_to_string(Val)]), - case dict:find(KeyLabel, Dict) of + case maps:find(KeyLabel, Map) of {ok, Value} -> case erl_types:t_is_equal(Val, Value) of true -> MS; @@ -2788,10 +2787,10 @@ enter_type(Key, Val, MS) -> end end. -store_map(Key, Val, #map{dict = Dict, ref = undefined} = Map) -> - Map#map{dict = dict:store(Key, Val, Dict)}; -store_map(Key, Val, #map{dict = Dict, modified = Mod} = Map) -> - Map#map{dict = dict:store(Key, Val, Dict), modified = [Key | Mod]}. +store_map(Key, Val, #map{map = Map, ref = undefined} = MapRec) -> + MapRec#map{map = maps:put(Key, Val, Map)}; +store_map(Key, Val, #map{map = Map, modified = Mod} = MapRec) -> + MapRec#map{map = maps:put(Key, Val, Map), modified = [Key | Mod]}. enter_subst(Key, Val0, #map{subst = Subst} = MS) -> KeyLabel = get_label(Key), @@ -2804,7 +2803,7 @@ enter_subst(Key, Val0, #map{subst = Subst} = MS) -> false -> MS; true -> ValLabel = get_label(Val), - case dict:find(ValLabel, Subst) of + case maps:find(ValLabel, Subst) of {ok, NewVal} -> enter_subst(Key, NewVal, MS); error -> @@ -2818,22 +2817,22 @@ enter_subst(Key, Val0, #map{subst = Subst} = MS) -> end. store_subst(Key, Val, #map{subst = S, ref = undefined} = Map) -> - Map#map{subst = dict:store(Key, Val, S)}; + Map#map{subst = maps:put(Key, Val, S)}; store_subst(Key, Val, #map{subst = S, modified = Mod} = Map) -> - Map#map{subst = dict:store(Key, Val, S), modified = [Key | Mod]}. + Map#map{subst = maps:put(Key, Val, S), modified = [Key | Mod]}. -lookup_type(Key, #map{dict = Dict, subst = Subst}) -> - lookup(Key, Dict, Subst, t_none()). +lookup_type(Key, #map{map = Map, subst = Subst}) -> + lookup(Key, Map, Subst, t_none()). -lookup(Key, Dict, Subst, AnyNone) -> +lookup(Key, Map, Subst, AnyNone) -> case cerl:is_literal(Key) of true -> literal_type(Key); false -> Label = get_label(Key), - case dict:find(Label, Subst) of - {ok, NewKey} -> lookup(NewKey, Dict, Subst, AnyNone); + case maps:find(Label, Subst) of + {ok, NewKey} -> lookup(NewKey, Map, Subst, AnyNone); error -> - case dict:find(Label, Dict) of + case maps:find(Label, Map) of {ok, Val} -> Val; error -> AnyNone end @@ -2871,12 +2870,12 @@ mark_as_fresh([], Map) -> Map. -ifdef(DEBUG). -debug_pp_map(#map{dict = Dict}=Map) -> - Keys = dict:fetch_keys(Dict), +debug_pp_map(#map{map = Map}=MapRec) -> + Keys = maps:keys(Map), io:format("Map:\n", []), lists:foreach(fun (Key) -> io:format("\t~w :: ~s\n", - [Key, t_to_string(lookup_type(Key, Map))]) + [Key, t_to_string(lookup_type(Key, MapRec))]) end, Keys), ok. -else. diff --git a/lib/dialyzer/src/dialyzer_gui_wx.erl b/lib/dialyzer/src/dialyzer_gui_wx.erl index 9f344d87ff..30d2bdeca4 100644 --- a/lib/dialyzer/src/dialyzer_gui_wx.erl +++ b/lib/dialyzer/src/dialyzer_gui_wx.erl @@ -422,7 +422,7 @@ gui_loop(#gui_state{backend_pid = BackendPid, doc_plt = DocPlt, #wx{id=?menuID_HELP_ABOUT, obj=Frame, event=#wxCommand{type=command_menu_selected}} -> Message = " This is DIALYZER version " ++ ?VSN ++ " \n"++ - "DIALYZER is a DIscrepany AnaLYZer for ERlang programs.\n\n"++ + "DIALYZER is a DIscrepancy AnaLYZer for ERlang programs.\n\n"++ " Copyright (C) Tobias Lindahl <[email protected]>\n"++ " Kostis Sagonas <[email protected]>\n\n", output_sms(State, "About Dialyzer", Message, info), diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl index 50fcbc555b..1787b66192 100644 --- a/lib/dialyzer/src/dialyzer_typesig.erl +++ b/lib/dialyzer/src/dialyzer_typesig.erl @@ -2,7 +2,7 @@ %%----------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2015. All Rights Reserved. +%% Copyright Ericsson AB 2006-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -66,9 +66,11 @@ %%----------------------------------------------------------------------------- -type dep() :: integer(). %% type variable names used as constraint ids +-type deps() :: ordsets:ordset(dep()). + -type type_var() :: erl_types:erl_type(). %% actually: {'c','var',_,_} --record(fun_var, {'fun' :: fun((_) -> erl_types:erl_type()), deps :: [dep()], +-record(fun_var, {'fun' :: fun((_) -> erl_types:erl_type()), deps :: deps(), origin :: integer() | 'undefined'}). -type constr_op() :: 'eq' | 'sub'. @@ -77,20 +79,21 @@ -record(constraint, {lhs :: erl_types:erl_type(), op :: constr_op(), rhs :: fvar_or_type(), - deps :: [dep()]}). + deps :: deps()}). -type constraint() :: #constraint{}. +-type mask() :: ordsets:ordset(non_neg_integer()). + -record(constraint_list, {type :: 'conj' | 'disj', list :: [constr()], - deps :: [dep()], - masks = [] :: [{dep(),[non_neg_integer()]}] | - {'d',dict:dict(dep(), [non_neg_integer()])}, + deps :: deps(), + masks = maps:new() :: #{dep() => mask()}, id :: {'list', dep()} | 'undefined'}). -type constraint_list() :: #constraint_list{}. --record(constraint_ref, {id :: type_var(), deps :: [dep()]}). +-record(constraint_ref, {id :: type_var(), deps :: deps()}). -type constraint_ref() :: #constraint_ref{}. @@ -99,32 +102,29 @@ -type types() :: erl_types:type_table(). -type typesig_scc() :: [{mfa(), {cerl:c_var(), cerl:c_fun()}, types()}]. --type typesig_funmap() :: [{type_var(), type_var()}]. %% Orddict +-type typesig_funmap() :: #{type_var() => type_var()}. -type prop_types() :: dict:dict(label(), types()). --type dict_or_ets() :: {'d', prop_types()} | {'e', ets:tid()}. - --record(state, {callgraph :: dialyzer_callgraph:callgraph() - | 'undefined', - cs = [] :: [constr()], - cmap = {'d', dict:new()} :: dict_or_ets(), - fun_map = [] :: typesig_funmap(), - fun_arities = dict:new() :: dict:dict(type_var(), arity()), - in_match = false :: boolean(), - in_guard = false :: boolean(), - module :: module(), - name_map = dict:new() :: dict:dict(mfa(), - cerl:c_fun()), - next_label = 0 :: label(), - self_rec :: 'false' | erl_types:erl_type(), - plt :: dialyzer_plt:plt() - | 'undefined', - prop_types = {'d', dict:new()} :: dict_or_ets(), - records = dict:new() :: types(), - scc = [] :: [type_var()], - mfas :: [tuple()], - solvers = [] :: [solver()] +-record(state, {callgraph :: dialyzer_callgraph:callgraph() + | 'undefined', + cs = [] :: [constr()], + cmap = maps:new() :: #{type_var() => constr()}, + fun_map = maps:new() :: typesig_funmap(), + fun_arities = maps:new() :: #{type_var() => arity()}, + in_match = false :: boolean(), + in_guard = false :: boolean(), + module :: module(), + name_map = maps:new() :: #{mfa() => cerl:c_fun()}, + next_label = 0 :: label(), + self_rec :: 'false' | erl_types:erl_type(), + plt :: dialyzer_plt:plt() + | 'undefined', + prop_types = dict:new() :: prop_types(), + records = dict:new() :: types(), + scc = [] :: ordsets:ordset(type_var()), + mfas :: [mfa()], + solvers = [] :: [solver()] }). -type state() :: #state{}. @@ -190,7 +190,8 @@ analyze_scc(SCC, NextLabel, CallGraph, Plt, PropTypes, Solvers0) -> Funs = state__scc(State3), pp_constrs_scc(Funs, State3), constraints_to_dot_scc(Funs, State3), - solve(Funs, State3). + T = solve(Funs, State3), + dict:from_list(maps:to_list(T)). assert_format_of_scc([{_MFA, {_Var, _Fun}, _Records}|Left]) -> assert_format_of_scc(Left); @@ -944,11 +945,11 @@ get_safe_underapprox(Pats, Guard) -> Map1 = cerl_trees:fold(fun(X, Acc) -> case cerl:is_c_var(X) of true -> - dict:store(cerl_trees:get_label(X), t_any(), - Acc); + maps:put(cerl_trees:get_label(X), t_any(), + Acc); false -> Acc end - end, dict:new(), cerl:c_values(Pats)), + end, maps:new(), cerl:c_values(Pats)), {Type, Map2} = get_underapprox_from_guard(Guard, Map1), Map3 = case t_is_none(t_inf(t_from_term(true), Type)) of true -> throw(dont_know); @@ -956,8 +957,8 @@ get_safe_underapprox(Pats, Guard) -> case cerl:is_c_var(Guard) of false -> Map2; true -> - dict:store(cerl_trees:get_label(Guard), - t_from_term(true), Map2) + maps:put(cerl_trees:get_label(Guard), + t_from_term(true), Map2) end end, {Ts, _Map4} = get_safe_underapprox_1(Pats, [], Map3), @@ -983,7 +984,7 @@ get_underapprox_from_guard(Tree, Map) -> case t_is_none(Inf) of true -> throw(dont_know); false -> - {True, dict:store(cerl_trees:get_label(Fun), Inf, Map1)} + {True, maps:put(cerl_trees:get_label(Fun), Inf, Map1)} end end; MFA -> @@ -999,7 +1000,7 @@ get_underapprox_from_guard(Tree, Map) -> case cerl:is_literal(Arg) of true -> {True, Map1}; false -> - {True, dict:store(cerl_trees:get_label(Arg), Inf, Map1)} + {True, maps:put(cerl_trees:get_label(Arg), Inf, Map1)} end end; error -> @@ -1031,7 +1032,7 @@ get_underapprox_from_guard(Tree, Map) -> end; var -> Type = - case dict:find(cerl_trees:get_label(Tree), Map) of + case maps:find(cerl_trees:get_label(Tree), Map) of error -> throw(dont_know); {ok, T} -> T end, @@ -1135,7 +1136,7 @@ get_safe_underapprox_1([Pat0|Left], Acc, Map) -> case t_is_none(Inf) of true -> throw(dont_know); false -> - Map3 = dict:store(cerl_trees:get_label(AVar), Inf, Map2), + Map3 = maps:put(cerl_trees:get_label(AVar), Inf, Map2), get_safe_underapprox_1(Left, [Inf|Acc], Map3) end; binary -> @@ -1203,7 +1204,7 @@ get_safe_underapprox_1([Pat0|Left], Acc, Map) -> Type = t_product(Ts), get_safe_underapprox_1(Left, [Type|Acc], Map1); var -> - case dict:find(cerl_trees:get_label(Pat), Map) of + case maps:find(cerl_trees:get_label(Pat), Map) of error -> throw(dont_know); {ok, VarType} -> get_safe_underapprox_1(Left, [VarType|Acc], Map) end @@ -1802,12 +1803,16 @@ solve([Fun], State) -> solve([_|_] = SCC, State) -> ?debug("============ Analyzing SCC: ~w ===========\n", [[debug_lookup_name(F) || F <- SCC]]), - {Parallel, NewState} = - case parallel_split(SCC) of - false -> {false, State}; - SplitSCC -> {SplitSCC, minimize_state(State)} - end, - solve_scc(SCC, Parallel, map_new(), NewState, false). + Users = comp_users(SCC, State), + solve_scc(SCC, map_new(), State, Users, _ToSolve=SCC, false). + +comp_users(SCC, State) -> + Vars0 = [{Fun, state__get_rec_var(Fun, State)} || Fun <- SCC], + Vars = lists:sort([t_var_name(Var) || {_, {ok, Var}} <- Vars0]), + family([{t_var(V), F} || + F <- SCC, + V <- ordsets:intersection(get_deps(state__get_cs(F, State)), + Vars)]). solve_fun(Fun, FunMap, State) -> Cs = state__get_cs(Fun, State), @@ -1822,7 +1827,7 @@ solve_fun(Fun, FunMap, State) -> end, enter_type(Fun, NewType, NewFunMap1). -solve_scc(SCC, Parallel, Map, State, TryingUnit) -> +solve_scc(SCC, Map, State, Users, ToSolve, TryingUnit) -> Vars0 = [{Fun, state__get_rec_var(Fun, State)} || Fun <- SCC], Vars = [Var || {_, {ok, Var}} <- Vars0], Funs = [Fun || {Fun, {ok, _}} <- Vars0], @@ -1830,16 +1835,13 @@ solve_scc(SCC, Parallel, Map, State, TryingUnit) -> RecTypes = [t_limit(Type, ?TYPE_LIMIT) || Type <- Types], CleanMap = lists:foldl(fun(Fun, AccFunMap) -> erase_type(t_var_name(Fun), AccFunMap) - end, Map, SCC), + end, Map, ToSolve), Map1 = enter_type_lists(Vars, RecTypes, CleanMap), ?debug("Checking SCC: ~w\n", [[debug_lookup_name(F) || F <- SCC]]), - FunSet = ordsets:from_list([t_var_name(F) || F <- SCC]), - Map2 = - case Parallel of - false -> solve_whole_scc(SCC, Map1, State); - SplitSCC -> solve_whole_scc_parallel(SplitSCC, Map1, State) - end, - case maps_are_equal(Map2, Map, FunSet) of + SolveFun = fun(X, Y) -> scc_fold_fun(X, Y, State) end, + Map2 = lists:foldl(SolveFun, Map1, ToSolve), + Updated = updated_vars_only(Vars, Map, Map2), + case Updated =:= [] of true -> ?debug("SCC ~w reached fixpoint\n", [SCC]), NewTypes = unsafe_lookup_type_list(Funs, Map2), @@ -1852,130 +1854,21 @@ solve_scc(SCC, Parallel, Map, State, TryingUnit) -> true -> t_fun(t_fun_args(T), t_unit()) end || T <- NewTypes], Map3 = enter_type_lists(Funs, UnitTypes, Map2), - solve_scc(SCC, Parallel, Map3, State, true); + solve_scc(SCC, Map3, State, Users, SCC, true); false -> - case Parallel of - false -> true; - _ -> dispose_state(State) - end, Map2 end; false -> ?debug("SCC ~w did not reach fixpoint\n", [SCC]), - solve_scc(SCC, Parallel, Map2, State, TryingUnit) + ToSolve1 = affected(Updated, Users), + solve_scc(SCC, Map2, State, Users, ToSolve1, TryingUnit) end. -solve_whole_scc(SCC, Map, State) -> - SolveFun = fun(X, Y) -> scc_fold_fun(X, Y, State) end, - lists:foldl(SolveFun, Map, SCC). - -%%------------------------------------------------------------------------------ - --define(worth_it, 42). - -parallel_split(SCC) -> - Length = length(SCC), - case Length > 2*?worth_it of - false -> false; - true -> - case min(dialyzer_utils:parallelism(), 8) of - 1 -> false; - CPUs -> - FullShare = Length div CPUs + 1, - Unit = max(FullShare, ?worth_it), - split(SCC, Unit, []) - end - end. - -minimize_state(#state{ - cmap = {d, CMap}, - fun_map = FunMap, - fun_arities = FunArities, - self_rec = SelfRec, - prop_types = {d, PropTypes}, - solvers = Solvers - }) -> - Opts = [{read_concurrency, true}], - ETSCMap = ets:new(cmap, Opts), - ETSPropTypes = ets:new(prop_types, Opts), - true = ets:insert(ETSCMap, dict:to_list(CMap)), - true = ets:insert(ETSPropTypes, dict:to_list(PropTypes)), - #state - {cmap = {e, ETSCMap}, - fun_map = FunMap, - fun_arities = FunArities, - self_rec = SelfRec, - prop_types = {e, ETSPropTypes}, - solvers = Solvers, - callgraph = undefined, - plt = undefined, - mfas = [] - }. - -dispose_state(#state{cmap = {e, ETSCMap}, - prop_types = {e, ETSPropTypes}}) -> - true = ets:delete(ETSCMap), - true = ets:delete(ETSPropTypes). - -solve_whole_scc_parallel(SplitSCC, Map, State) -> - Workers = spawn_workers(SplitSCC, Map, State), - wait_results(Workers, Map, fold_res_fun(State)). - -spawn_workers(SplitSCC, Map, State) -> - Spawner = solve_scc_spawner(self(), Map, State), - lists:foreach(Spawner, SplitSCC), - length(SplitSCC). - -wait_results(0, Map, _FoldResFun) -> - Map; -wait_results(Pending, Map, FoldResFun) -> - Res = receive_scc_result(), - NewMap = lists:foldl(FoldResFun, Map, Res), - wait_results(Pending-1, NewMap, FoldResFun). - -solve_scc_spawner(Parent, Map, State) -> - fun(SCCPart) -> - spawn_link(fun() -> solve_scc_worker(Parent, SCCPart, Map, State) end) - end. - -split([], _Unit, Acc) -> - Acc; -split(List, Unit, Acc) -> - {Taken, Rest} = - try - lists:split(Unit, List) - catch - _:_ -> {List, []} - end, - split(Rest, Unit, [Taken|Acc]). - -solve_scc_worker(Parent, SCCPart, Map, State) -> - SolveFun = fun(X, Y) -> scc_fold_fun(X, Y, State) end, - FinalMap = lists:foldl(SolveFun, Map, SCCPart), - Res = - [{F, t_limit(unsafe_lookup_type(F, FinalMap), ?TYPE_LIMIT)} || - F <- SCCPart], - send_scc_result(Parent, Res). - -fold_res_fun(State) -> - fun({F, Type}, Map) -> - case state__get_rec_var(F, State) of - {ok, R} -> - enter_type(R, Type, enter_type(F, Type, Map)); - error -> - enter_type(F, Type, Map) - end - end. - -receive_scc_result() -> - receive - {scc_fun, Res} -> Res - end. - -send_scc_result(Parent, Res) -> - Parent ! {scc_fun, Res}. - -%%------------------------------------------------------------------------------ +affected(Updated, Users) -> + lists:umerge([case lists:keyfind(V, 1, Users) of + {V, Vs} -> Vs; + false -> [] + end || V <- Updated]). scc_fold_fun(F, FunMap, State) -> Deps = get_deps(state__get_cs(F, State)), @@ -2017,7 +1910,7 @@ solver(Solver, SolveFun) -> solve_fun(v1, _Fun, Cs, FunMap, State) -> fun() -> - {ok, _MapDict, NewMap} = solve_ref_or_list(Cs, FunMap, dict:new(), State), + {ok, _MapDict, NewMap} = solve_ref_or_list(Cs, FunMap, map_new(), State), {ok, NewMap} end; solve_fun(v2, Fun, _Cs, FunMap, State) -> @@ -2057,7 +1950,7 @@ sane_maps(Map1, Map2, Keys, _S1, _S2) -> %% Solver v2 --record(v2_state, {constr_data = dict:new() :: dict:dict(), +-record(v2_state, {constr_data = maps:new() :: map(), state :: state()}). v2_solve_ref(Fun, Map, State) -> @@ -2219,30 +2112,30 @@ v2_solve_disj(Is, [C|Cs], I, Map, V2State, UL, MapL, Eval, Uneval0, Failed) -> v2_solve_disj(Is, Cs, I+1, Map, V2State, UL, MapL, Eval, Uneval, Failed). save_local_map(#v2_state{constr_data = ConData}=V2State, Id, U, Map) -> - Part0 = [{V,dict:fetch(V, Map)} || V <- U], + Part0 = [{V,maps:get(V, Map)} || V <- U], Part1 = - case dict:find(Id, ConData) of + case maps:find(Id, ConData) of error -> []; % cannot happen {ok, {Part2,[]}} -> Part2 end, ?debug("save local map Id=~w:\n", [Id]), Part = lists:ukeymerge(1, lists:keysort(1, Part0), Part1), - pp_map("New Part", dict:from_list(Part0)), - pp_map("Old Part", dict:from_list(Part1)), - pp_map(" => Part", dict:from_list(Part)), - V2State#v2_state{constr_data = dict:store(Id, {Part,[]}, ConData)}. + pp_map("New Part", maps:from_list(Part0)), + pp_map("Old Part", maps:from_list(Part1)), + pp_map(" => Part", maps:from_list(Part)), + V2State#v2_state{constr_data = maps:put(Id, {Part,[]}, ConData)}. restore_local_map(#v2_state{constr_data = ConData}, Id, Map0) -> - case dict:find(Id, ConData) of + case maps:find(Id, ConData) of error -> Map0; {ok, failed} -> Map0; {ok, {[],_}} -> Map0; {ok, {Part0,U}} -> Part = [KV || {K,_V} = KV <- Part0, not lists:member(K, U)], ?debug("restore local map Id=~w U=~w\n", [Id, U]), - pp_map("Part", dict:from_list(Part)), + pp_map("Part", maps:from_list(Part)), pp_map("Map0", Map0), - Map = lists:foldl(fun({K,V}, D) -> dict:store(K, V, D) end, Map0, Part), + Map = lists:foldl(fun({K,V}, D) -> maps:put(K, V, D) end, Map0, Part), pp_map("Map", Map), Map end. @@ -2322,31 +2215,26 @@ report_detected_loop(_) -> add_mask_to_flags(Flags, [Im|M], I, L) when I > Im -> add_mask_to_flags(Flags, M, I, [Im|L]); add_mask_to_flags(Flags, [_|M], _I, L) -> - {lists:umerge(Flags, M), lists:reverse(L)}. + {lists:umerge(M, Flags), lists:reverse(L)}. -get_mask(V, {d, Masks}) -> - case dict:find(V, Masks) of +get_mask(V, Masks) -> + case maps:find(V, Masks) of error -> []; {ok, M} -> M - end; -get_mask(V, Masks) -> - case lists:keyfind(V, 1, Masks) of - false -> []; - {V, M} -> M end. get_flags(#v2_state{constr_data = ConData}=V2State0, C) -> #constraint_list{id = Id, list = Cs, masks = Masks} = C, - case dict:find(Id, ConData) of + case maps:find(Id, ConData) of error -> ?debug("get_flags Id=~w Flags=all ~w\n", [Id, length(Cs)]), - V2State = V2State0#v2_state{constr_data = dict:store(Id, {[],[]}, ConData)}, + V2State = V2State0#v2_state{constr_data = maps:put(Id, {[],[]}, ConData)}, {V2State, lists:seq(1, length(Cs))}; {ok, failed} -> {V2State0, failed_list}; {ok, {Part,U}} when U =/= [] -> ?debug("get_flags Id=~w U=~w\n", [Id, U]), - V2State = V2State0#v2_state{constr_data = dict:store(Id, {Part,[]}, ConData)}, + V2State = V2State0#v2_state{constr_data = maps:put(Id, {Part,[]}, ConData)}, save_updated_vars_list(Cs, vars_per_child(U, Masks), V2State) end. @@ -2375,13 +2263,13 @@ save_updated_vars(#constraint_ref{id = Id}, U, V2State) -> save_updated_vars1(V2State, C, U) -> #v2_state{constr_data = ConData} = V2State, #constraint_list{id = Id} = C, - case dict:find(Id, ConData) of + case maps:find(Id, ConData) of error -> V2State; % error means everything is flagged {ok, failed} -> V2State; {ok, {Part,U0}} -> %% Duplicates are not so common; let masks/2 remove them. U1 = U ++ U0, - V2State#v2_state{constr_data = dict:store(Id, {Part,U1}, ConData)} + V2State#v2_state{constr_data = maps:put(Id, {Part,U1}, ConData)} end. -ifdef(DEBUG). @@ -2391,12 +2279,12 @@ pp_constr_data(_Tag, #v2_state{constr_data = D}) -> case _PartU of {_Part, _U} -> io:format("Id: ~w Vars: ~w\n", [_Id, _U]), - [pp_map("Part", dict:from_list(_Part)) || _Part =/= []]; + [pp_map("Part", maps:from_list(_Part)) || _Part =/= []]; failed -> io:format("Id: ~w failed list\n", [_Id]) end end || - {_Id, _PartU} <- lists:keysort(1, dict:to_list(D))], + {_Id, _PartU} <- lists:keysort(1, maps:to_list(D))], ok. -else. @@ -2406,17 +2294,17 @@ pp_constr_data(_Tag, _V2State) -> failed_list(#constraint_list{id = Id}, #v2_state{constr_data = D}=V2State) -> ?debug("error list ~w~n", [Id]), - V2State#v2_state{constr_data = dict:store(Id, failed, D)}. + V2State#v2_state{constr_data = maps:put(Id, failed, D)}. is_failed_list(#constraint_list{id = Id}, #v2_state{constr_data = D}) -> - dict:find(Id, D) =:= {ok, failed}. + maps:find(Id, D) =:= {ok, failed}. %% Solver v1 solve_ref_or_list(#constraint_ref{id = Id, deps = Deps}, Map, MapDict, State) -> {OldLocalMap, Check} = - case dict:find(Id, MapDict) of + case maps:find(Id, MapDict) of error -> {map_new(), false}; {ok, M} -> {M, true} end, @@ -2462,12 +2350,12 @@ solve_ref_or_list(#constraint_ref{id = Id, deps = Deps}, {ok, Var} -> enter_type(Var, FunType, NewMap1); error -> NewMap1 end, - {ok, dict:store(Id, NewMap2, NewMapDict), NewMap2} + {ok, maps:put(Id, NewMap2, NewMapDict), NewMap2} end; solve_ref_or_list(#constraint_list{type=Type, list = Cs, deps = Deps, id = Id}, Map, MapDict, State) -> {OldLocalMap, Check} = - case dict:find(Id, MapDict) of + case maps:find(Id, MapDict) of error -> {map_new(), false}; {ok, M} -> {M, true} end, @@ -2517,7 +2405,7 @@ solve_self_recursive(Cs, Map, MapDict, Id, RecType0, State) -> solve_clist(Cs, conj, Id, Deps, MapDict, Map, State) -> case solve_cs(Cs, Map, MapDict, State) of {error, NewMapDict} -> - {error, dict:store(Id, error, NewMapDict)}; + {error, maps:put(Id, error, NewMapDict)}; {ok, NewMapDict, NewMap} = Ret -> case Cs of [_] -> @@ -2525,7 +2413,7 @@ solve_clist(Cs, conj, Id, Deps, MapDict, Map, State) -> Ret; _ -> case maps_are_equal(Map, NewMap, Deps) of - true -> {ok, dict:store(Id, NewMap, NewMapDict), NewMap}; + true -> {ok, maps:put(Id, NewMap, NewMapDict), NewMap}; false -> solve_clist(Cs, conj, Id, Deps, NewMapDict, NewMap, State) end end @@ -2539,10 +2427,10 @@ solve_clist(Cs, disj, Id, _Deps, MapDict, Map, State) -> end, {Maps, NewMapDict} = lists:mapfoldl(Fun, MapDict, Cs), case [X || {ok, X} <- Maps] of - [] -> {error, dict:store(Id, error, NewMapDict)}; + [] -> {error, maps:put(Id, error, NewMapDict)}; MapList -> NewMap = join_maps(MapList), - {ok, dict:store(Id, NewMap, NewMapDict), NewMap} + {ok, maps:put(Id, NewMap, NewMapDict), NewMap} end. solve_cs([#constraint_ref{} = C|Tail], Map, MapDict, State) -> @@ -2623,7 +2511,7 @@ report_failed_constraint(_C, _Map) -> %% ============================================================================ map_new() -> - dict:new(). + maps:new(). join_maps([Map]) -> Map; @@ -2633,9 +2521,9 @@ join_maps(Maps) -> constrained_keys(Maps) -> lists:foldl(fun(TmpMap, AccKeys) -> - [Key || Key <- AccKeys, dict:is_key(Key, TmpMap)] + [Key || Key <- AccKeys, maps:is_key(Key, TmpMap)] end, - dict:fetch_keys(hd(Maps)), tl(Maps)). + maps:keys(hd(Maps)), tl(Maps)). join_maps([Key|Left], Maps = [Map|MapsLeft], AccMap) -> NewType = join_one_key(Key, MapsLeft, lookup_type(Key, Map)), @@ -2681,11 +2569,11 @@ prune_keys(Map1, Map2, Deps) -> NofDeps = length(Deps), case NofDeps > ?PRUNE_LIMIT of true -> - Keys1 = dict:fetch_keys(Map1), + Keys1 = maps:keys(Map1), case length(Keys1) > NofDeps of true -> Set1 = lists:sort(Keys1), - Set2 = lists:sort(dict:fetch_keys(Map2)), + Set2 = lists:sort(maps:keys(Map2)), ordsets:intersection(ordsets:union(Set1, Set2), Deps); false -> Deps @@ -2706,7 +2594,7 @@ enter_type(Key, Val, Map) when is_integer(Key) -> true -> ok; false -> ?debug("LimitedVal ~s\n", [format_type(LimitedVal)]) end, - case dict:find(Key, Map) of + case maps:find(Key, Map) of {ok, Value} -> case is_equal(Value, LimitedVal) of true -> Map; @@ -2740,16 +2628,16 @@ enter_type2(Key, Val, Map) -> map_store(Key, Val, Map) -> ?debug("Storing ~w :: ~s\n", [Key, format_type(Val)]), - dict:store(Key, Val, Map). + maps:put(Key, Val, Map). erase_type(Key, Map) -> - dict:erase(Key, Map). + maps:remove(Key, Map). lookup_type_list(List, Map) -> [lookup_type(X, Map) || X <- List]. unsafe_lookup_type(Key, Map) -> - case dict:find(t_var_name(Key), Map) of + case maps:find(t_var_name(Key), Map) of {ok, Type} -> Type; error -> t_none() end. @@ -2758,7 +2646,7 @@ unsafe_lookup_type_list(List, Map) -> [unsafe_lookup_type(X, Map) || X <- List]. lookup_type(Key, Map) when is_integer(Key) -> - case dict:find(Key, Map) of + case maps:find(Key, Map) of error -> t_any(); {ok, Val} -> Val end; @@ -2806,7 +2694,7 @@ is_equal(Type1, Type2) -> pp_map(_S, _Map) -> ?debug("\t~s: ~p\n", [_S, [{X, lists:flatten(format_type(Y))} || - {X, Y} <- lists:keysort(1, dict:to_list(_Map))]]). + {X, Y} <- lists:keysort(1, maps:to_list(_Map))]]). %% ============================================================================ %% @@ -2816,7 +2704,7 @@ pp_map(_S, _Map) -> new_state(SCC0, NextLabel, CallGraph, Plt, PropTypes, Solvers) -> List = [{MFA, Var} || {MFA, {Var, _Fun}, _Rec} <- SCC0], - NameMap = dict:from_list(List), + NameMap = maps:from_list(List), MFAs = [MFA || {MFA, _Var} <- List], SCC = [mk_var(Fun) || {_MFA, {_Var, Fun}, _Rec} <- SCC0], SelfRec = @@ -2830,7 +2718,7 @@ new_state(SCC0, NextLabel, CallGraph, Plt, PropTypes, Solvers) -> _Many -> false end, #state{callgraph = CallGraph, name_map = NameMap, next_label = NextLabel, - prop_types = {d, PropTypes}, plt = Plt, scc = ordsets:from_list(SCC), + prop_types = PropTypes, plt = Plt, scc = ordsets:from_list(SCC), mfas = MFAs, self_rec = SelfRec, solvers = Solvers}. state__set_rec_dict(State, RecDict) -> @@ -2858,15 +2746,15 @@ state__get_fun_prototype(Op, Arity, State) -> end. state__lookup_rec_var_in_scope(MFA, #state{name_map = NameMap}) -> - dict:find(MFA, NameMap). + maps:find(MFA, NameMap). state__store_fun_arity(Tree, #state{fun_arities = Map} = State) -> Arity = length(cerl:fun_vars(Tree)), Id = mk_var(Tree), - State#state{fun_arities = dict:store(Id, Arity, Map)}. + State#state{fun_arities = maps:put(Id, Arity, Map)}. state__fun_arity(Id, #state{fun_arities = Map}) -> - dict:fetch(Id, Map). + maps:get(Id, Map). state__lookup_undef_var(Tree, #state{callgraph = CG, plt = Plt}) -> Label = cerl_trees:get_label(Tree), @@ -2926,21 +2814,14 @@ state__plt(#state{plt = PLT}) -> state__new_constraint_context(State) -> State#state{cs = []}. -state__prop_domain(FunLabel, #state{prop_types = {e, ETSPropTypes}}) -> - try ets:lookup_element(ETSPropTypes, FunLabel, 2) of - {_Range_Fun, Dom} -> {ok, Dom}; - FunType -> {ok, t_fun_args(FunType)} - catch - _:_ -> error - end; -state__prop_domain(FunLabel, #state{prop_types = {d, PropTypes}}) -> +state__prop_domain(FunLabel, #state{prop_types = PropTypes}) -> case dict:find(FunLabel, PropTypes) of error -> error; {ok, {_Range_Fun, Dom}} -> {ok, Dom}; {ok, FunType} -> {ok, t_fun_args(FunType)} end. -state__add_prop_constrs(Tree, #state{prop_types = {d, PropTypes}} = State) -> +state__add_prop_constrs(Tree, #state{prop_types = PropTypes} = State) -> Label = cerl_trees:get_label(Tree), case dict:find(Label, PropTypes) of error -> State; @@ -3003,14 +2884,12 @@ state__mk_vars(N, #state{next_label = NL} = State) -> Vars = [t_var(X) || X <- lists:seq(NL, NewLabel-1)], {State#state{next_label = NewLabel}, Vars}. -state__store_constrs(Id, Cs, #state{cmap = {d, Dict}} = State) -> - NewDict = dict:store(Id, Cs, Dict), - State#state{cmap = {d, NewDict}}. +state__store_constrs(Id, Cs, #state{cmap = Map} = State) -> + NewMap = maps:put(Id, Cs, Map), + State#state{cmap = NewMap}. -state__get_cs(Var, #state{cmap = {e, ETSDict}}) -> - ets:lookup_element(ETSDict, Var, 2); -state__get_cs(Var, #state{cmap = {d, Dict}}) -> - dict:fetch(Var, Dict). +state__get_cs(Var, #state{cmap = Map}) -> + maps:get(Var, Map). state__is_self_rec(Fun, #state{self_rec = SelfRec}) -> not (SelfRec =:= 'false') andalso is_equal(Fun, SelfRec). @@ -3019,15 +2898,12 @@ state__store_funs(Vars0, Funs0, #state{fun_map = Map} = State) -> debug_make_name_map(Vars0, Funs0), Vars = mk_var_list(Vars0), Funs = mk_var_list(Funs0), - NewMap = lists:foldl(fun({Var, Fun}, MP) -> orddict:store(Var, Fun, MP) end, + NewMap = lists:foldl(fun({Var, Fun}, MP) -> maps:put(Fun, Var, MP) end, Map, lists:zip(Vars, Funs)), State#state{fun_map = NewMap}. state__get_rec_var(Fun, #state{fun_map = Map}) -> - case [V || {V, FV} <- Map, FV =:= Fun] of - [Var] -> {ok, Var}; - [] -> error - end. + maps:find(Fun, Map). state__finalize(State) -> State1 = enumerate_constraints(State), @@ -3094,13 +2970,13 @@ mk_fun_var(Fun, Types) -> -endif. --spec get_deps(constr()) -> [dep()]. +-spec get_deps(constr()) -> deps(). get_deps(#constraint{deps = D}) -> D; get_deps(#constraint_list{deps = D}) -> D; get_deps(#constraint_ref{deps = D}) -> D. --spec find_constraint_deps([fvar_or_type()]) -> [dep()]. +-spec find_constraint_deps([fvar_or_type()]) -> deps(). find_constraint_deps(List) -> ordsets:from_list(find_constraint_deps(List, [])). @@ -3348,18 +3224,11 @@ order_fun_constraints([], Funs, Acc, State) -> update_masks(C, Masks) -> C#constraint_list{masks = Masks}. --define(VARS_LIMIT, 50). - calculate_masks([C|Cs], I, L0) -> calculate_masks(Cs, I+1, [{V, I} || V <- get_deps(C)] ++ L0); calculate_masks([], _I, L) -> M = family(L), - case length(M) > ?VARS_LIMIT of - true -> - {d, dict:from_list(M)}; - false -> - M - end. + maps:from_list(M). %% ============================================================================ %% @@ -3487,7 +3356,7 @@ join_chars([H|T], Sep) -> [H|[[Sep,X] || X <- T]]. debug_lookup_name(Var) -> - case dict:find(t_var_name(Var), get(dialyzer_typesig_map)) of + case maps:find(t_var_name(Var), get(dialyzer_typesig_map)) of error -> Var; {ok, Name} -> Name end. @@ -3497,7 +3366,7 @@ debug_lookup_name(Var) -> debug_make_name_map(Vars, Funs) -> Map = get(dialyzer_typesig_map), NewMap = - if Map =:= undefined -> debug_make_name_map(Vars, Funs, dict:new()); + if Map =:= undefined -> debug_make_name_map(Vars, Funs, maps:new()); true -> debug_make_name_map(Vars, Funs, Map) end, put(dialyzer_typesig_map, NewMap). @@ -3505,7 +3374,7 @@ debug_make_name_map(Vars, Funs) -> debug_make_name_map([Var|VarLeft], [Fun|FunLeft], Map) -> Name = {cerl:fname_id(Var), cerl:fname_arity(Var)}, FunLabel = cerl_trees:get_label(Fun), - debug_make_name_map(VarLeft, FunLeft, dict:store(FunLabel, Name, Map)); + debug_make_name_map(VarLeft, FunLeft, maps:put(FunLabel, Name, Map)); debug_make_name_map([], [], Map) -> Map. diff --git a/lib/edoc/src/edoc.erl b/lib/edoc/src/edoc.erl index d2494b69fe..94013bb5ac 100644 --- a/lib/edoc/src/edoc.erl +++ b/lib/edoc/src/edoc.erl @@ -653,20 +653,7 @@ find_invalid_unicode([]) -> none. parse_file(Epp) -> case scan_and_parse(Epp) of {ok, Form} -> - case Form of - {attribute,La,record,{Record, Fields}} -> - case epp:normalize_typed_record_fields(Fields) of - {typed, NewFields} -> - [{attribute, La, record, {Record, NewFields}}, - {attribute, La, type, - {{record, Record}, Fields, []}} - | parse_file(Epp)]; - not_typed -> - [Form | parse_file(Epp)] - end; - _ -> - [Form | parse_file(Epp)] - end; + [Form | parse_file(Epp)]; {error, E} -> [{error, E} | parse_file(Epp)]; {eof, Location} -> diff --git a/lib/edoc/src/edoc_extract.erl b/lib/edoc/src/edoc_extract.erl index 758750083d..e7a4c36ca4 100644 --- a/lib/edoc/src/edoc_extract.erl +++ b/lib/edoc/src/edoc_extract.erl @@ -355,6 +355,8 @@ preprocess_forms_2(F, Fs) -> [F | preprocess_forms_1(Fs)]; text -> [F | preprocess_forms_1(Fs)]; + {attribute, {record, _}} -> + [F | preprocess_forms_1(Fs)]; {attribute, {N, _}} -> case edoc_specs:is_tag(N) of true -> @@ -373,50 +375,62 @@ preprocess_forms_2(F, Fs) -> %% in the list. collect(Fs, Mod) -> - collect(Fs, [], [], [], [], undefined, Mod). + collect(Fs, [], [], [], [], [], undefined, Mod). -collect([F | Fs], Cs, Ss, Ts, As, Header, Mod) -> +collect([F | Fs], Cs, Ss, Ts, Rs, As, Header, Mod) -> case erl_syntax_lib:analyze_form(F) of comment -> - collect(Fs, [F | Cs], Ss, Ts, As, Header, Mod); + collect(Fs, [F | Cs], Ss, Ts, Rs, As, Header, Mod); {function, Name} -> L = erl_syntax:get_pos(F), Export = ordsets:is_element(Name, Mod#module.exports), Args = parameters(erl_syntax:function_clauses(F)), - collect(Fs, [], [], [], + collect(Fs, [], [], [], [], [#entry{name = Name, args = Args, line = L, export = Export, - data = {comment_text(Cs),Ss,Ts}} | As], + data = {comment_text(Cs),Ss,Ts,Rs}} | As], Header, Mod); {attribute, {module, _}} when Header =:= undefined -> L = erl_syntax:get_pos(F), - collect(Fs, [], [], [], As, + collect(Fs, [], [], [], [], As, #entry{name = module, line = L, - data = {comment_text(Cs),Ss,Ts}}, + data = {comment_text(Cs),Ss,Ts,Rs}}, Mod); + {attribute, {record, {_Name, Fields}}} -> + case is_typed_record(Fields) of + true -> + collect(Fs, Cs, Ss, Ts, [F | Rs], As, Header, Mod); + false -> + collect(Fs, Cs, Ss, Ts, Rs, As, Header, Mod) + end; {attribute, {N, _}} -> case edoc_specs:tag(N) of spec -> - collect(Fs, Cs, [F | Ss], Ts, As, Header, Mod); + collect(Fs, Cs, [F | Ss], Ts, Rs, As, Header, Mod); type -> - collect(Fs, Cs, Ss, [F | Ts], As, Header, Mod); + collect(Fs, Cs, Ss, [F | Ts], Rs, As, Header, Mod); unknown -> %% Drop current seen comments. - collect(Fs, [], [], [], As, Header, Mod) + collect(Fs, [], [], [], Rs, As, Header, Mod) end; _ -> %% Drop current seen comments. - collect(Fs, [], [], [], As, Header, Mod) + collect(Fs, [], [], [], [], As, Header, Mod) end; -collect([], Cs, Ss, Ts, As, Header, _Mod) -> - Footer = #entry{name = footer, data = {comment_text(Cs),Ss,Ts}}, +collect([], Cs, Ss, Ts, Rs, As, Header, _Mod) -> + Footer = #entry{name = footer, data = {comment_text(Cs),Ss,Ts,Rs}}, As1 = lists:reverse(As), if Header =:= undefined -> - {#entry{name = module, data = {[],[],[]}}, Footer, As1}; + {#entry{name = module, data = {[],[],[],[]}}, Footer, As1}; true -> {Header, Footer, As1} end. +is_typed_record([]) -> + false; +is_typed_record([{_, {_, Type}} | Fs]) -> + Type =/= none orelse is_typed_record(Fs). + %% Returns a list of simplified comment information (position and text) %% for a list of abstract comments. The order of elements is reversed. @@ -549,8 +563,8 @@ get_tags(Es, Env, File, TypeDocs) -> How = dict:from_list(edoc_tags:tag_parsers()), get_tags(Es, Tags, Env, How, File, TypeDocs). -get_tags([#entry{name = Name, data = {Cs,Specs,Types}} = E | Es], Tags, Env, - How, File, TypeDocs) -> +get_tags([#entry{name = Name, data = {Cs,Specs,Types,Records}} = E | Es], + Tags, Env, How, File, TypeDocs) -> Where = {File, Name}, Ts0 = scan_tags(Cs), {Ts1,Specs1} = select_spec(Ts0, Where, Specs), @@ -558,7 +572,7 @@ get_tags([#entry{name = Name, data = {Cs,Specs,Types}} = E | Es], Tags, Env, Ts3 = edoc_macros:expand_tags(Ts2, Env, Where), Ts4 = edoc_tags:parse_tags(Ts3, How, Env, Where), Ts = selected_specs(Specs1, Ts4), - ETypes = [edoc_specs:type(Type, TypeDocs) || Type <- Types], + ETypes = [edoc_specs:type(Type, TypeDocs) || Type <- Types ++ Records], [E#entry{data = Ts++ETypes} | get_tags(Es, Tags, Env, How, File, TypeDocs)]; get_tags([], _, _, _, _, _) -> []. diff --git a/lib/edoc/src/edoc_specs.erl b/lib/edoc/src/edoc_specs.erl index f2e5891c2e..faee8adf7b 100644 --- a/lib/edoc/src/edoc_specs.erl +++ b/lib/edoc/src/edoc_specs.erl @@ -42,14 +42,15 @@ %% TypeDocs is a dict of {Name, Doc}. %% Note: #t_typedef.name is set to {record, R} for record types. type(Form, TypeDocs) -> - {Name, Data0} = erl_syntax_lib:analyze_wild_attribute(Form), - type = tag(Name), + {Name, Data0} = analyze_type_attribute(Form), {TypeName, Type, Args, Doc} = case Data0 of - {{record, R}, Fs, []} -> + {R, Fs} -> + record = Name, L = erl_syntax:get_pos(Form), {{record, R}, {type, L, record, [{atom,L,R} | Fs]}, [], ""}; {N,T,As} -> + type = tag(Name), Doc0 = case dict:find({N, length(As)}, TypeDocs) of {ok, Doc1} -> @@ -188,7 +189,7 @@ strip([_ | S]) -> %% Find the type name and the greatest line number of a type spec. %% Should use syntax_tools but this has to do for now. get_name_and_last_line(F) -> - {Name, Data} = erl_syntax_lib:analyze_wild_attribute(F), + {Name, Data} = analyze_type_attribute(F), type = edoc_specs:tag(Name), Attr = {attribute, erl_syntax:get_pos(F), Name, Data}, Fun = fun(A) -> @@ -229,6 +230,7 @@ get_all_tags(Es) -> %% Turns an opaque type into an abstract datatype. %% Note: top level annotation is ignored. opaque2abstr(opaque, _T) -> undefined; +opaque2abstr(record, T) -> T; opaque2abstr(type, T) -> T. %% Replaces the parameters extracted from the source (by @@ -608,6 +610,16 @@ type_name(#tag{name = type, data = {#t_typedef{name = Name, args = As},_}}) -> {Name, length(As)}. +analyze_type_attribute(Form) -> + Name = erl_syntax:atom_value(erl_syntax:attribute_name(Form)), + case tag(Name) of + type -> + erl_syntax_lib:analyze_wild_attribute(Form); + _ when Name =:= record -> + {attribute, _, record, {N, Fields}} = erl_syntax:revert(Form), + {record, {N, Fields}} + end. + %% @doc Return `true' if `Tag' is one of the specification and type %% attribute tags recognized by the Erlang compiler. diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl index 02e1625965..84addcc105 100644 --- a/lib/hipe/cerl/erl_types.erl +++ b/lib/hipe/cerl/erl_types.erl @@ -236,7 +236,7 @@ -export([t_is_identifier/1]). -endif. --export_type([erl_type/0, opaques/0, type_table/0, var_table/0]). +-export_type([erl_type/0, opaques/0, type_table/0]). %%-define(DEBUG, true). @@ -380,7 +380,7 @@ -type type_table() :: dict:dict(record_key() | type_key(), record_value() | type_value()). --type var_table() :: dict:dict(atom(), erl_type()). +-type var_table() :: #{atom() => erl_type()}. %%----------------------------------------------------------------------------- %% Unions @@ -3295,87 +3295,33 @@ findfirst(N1, N2, U1, B1, U2, B2) -> %%----------------------------------------------------------------------------- %% Substitution of variables %% -%% Dialyzer versions prior to R15B used a dict data structure to map variables -%% to types. Hans Bolinder suggested the use of lists of Key-Value pairs for -%% this data structure and measurements showed a non-trivial speedup when using -%% them for operations within this module (e.g. in t_unify/2). However, there -%% is code outside erl_types that still passes a dict:dict() in the 2nd argument. -%% So, for the time being, this module provides a t_subst/2 function for these -%% external calls and a clone of it (t_subst_kv/2) which is used from all calls -%% from within this module. This code duplication needs to be eliminated at -%% some point. - --spec t_subst(erl_type(), dict:dict(atom(), erl_type())) -> erl_type(). - -t_subst(T, Dict) -> + +-type subst_table() :: #{any() => erl_type()}. + +-spec t_subst(erl_type(), subst_table()) -> erl_type(). + +t_subst(T, Map) -> case t_has_var(T) of - true -> t_subst_dict(T, Dict); + true -> t_subst_aux(T, Map); false -> T end. -t_subst_dict(?var(Id), Dict) -> - case dict:find(Id, Dict) of - error -> ?any; - {ok, Type} -> Type - end; -t_subst_dict(?list(Contents, Termination, Size), Dict) -> - case t_subst_dict(Contents, Dict) of - ?none -> ?none; - NewContents -> - %% Be careful here to make the termination collapse if necessary. - case t_subst_dict(Termination, Dict) of - ?nil -> ?list(NewContents, ?nil, Size); - ?any -> ?list(NewContents, ?any, Size); - Other -> - ?list(NewContents2, NewTermination, _) = t_cons(NewContents, Other), - ?list(NewContents2, NewTermination, Size) - end - end; -t_subst_dict(?function(Domain, Range), Dict) -> - ?function(t_subst_dict(Domain, Dict), t_subst_dict(Range, Dict)); -t_subst_dict(?product(Types), Dict) -> - ?product([t_subst_dict(T, Dict) || T <- Types]); -t_subst_dict(?tuple(?any, ?any, ?any) = T, _Dict) -> - T; -t_subst_dict(?tuple(Elements, _Arity, _Tag), Dict) -> - t_tuple([t_subst_dict(E, Dict) || E <- Elements]); -t_subst_dict(?tuple_set(_) = TS, Dict) -> - t_sup([t_subst_dict(T, Dict) || T <- t_tuple_subtypes(TS)]); -t_subst_dict(?map(Pairs, DefK, DefV), Dict) -> - t_map([{K, MNess, t_subst_dict(V, Dict)} || {K, MNess, V} <- Pairs], - t_subst_dict(DefK, Dict), t_subst_dict(DefV, Dict)); -t_subst_dict(?opaque(Es), Dict) -> - List = [Opaque#opaque{args = [t_subst_dict(Arg, Dict) || Arg <- Args], - struct = t_subst_dict(S, Dict)} || - Opaque = #opaque{args = Args, struct = S} <- set_to_list(Es)], - ?opaque(ordsets:from_list(List)); -t_subst_dict(?union(List), Dict) -> - ?union([t_subst_dict(E, Dict) || E <- List]); -t_subst_dict(T, _Dict) -> - T. - -spec subst_all_vars_to_any(erl_type()) -> erl_type(). subst_all_vars_to_any(T) -> - t_subst_kv(T, []). + t_subst(T, #{}). -t_subst_kv(T, KVMap) -> - case t_has_var(T) of - true -> t_subst_aux(T, KVMap); - false -> T - end. - -t_subst_aux(?var(Id), VarMap) -> - case lists:keyfind(Id, 1, VarMap) of - false -> ?any; - {Id, Type} -> Type +t_subst_aux(?var(Id), Map) -> + case maps:find(Id, Map) of + error -> ?any; + {ok, Type} -> Type end; -t_subst_aux(?list(Contents, Termination, Size), VarMap) -> - case t_subst_aux(Contents, VarMap) of +t_subst_aux(?list(Contents, Termination, Size), Map) -> + case t_subst_aux(Contents, Map) of ?none -> ?none; NewContents -> %% Be careful here to make the termination collapse if necessary. - case t_subst_aux(Termination, VarMap) of + case t_subst_aux(Termination, Map) of ?nil -> ?list(NewContents, ?nil, Size); ?any -> ?list(NewContents, ?any, Size); Other -> @@ -3383,27 +3329,27 @@ t_subst_aux(?list(Contents, Termination, Size), VarMap) -> ?list(NewContents2, NewTermination, Size) end end; -t_subst_aux(?function(Domain, Range), VarMap) -> - ?function(t_subst_aux(Domain, VarMap), t_subst_aux(Range, VarMap)); -t_subst_aux(?product(Types), VarMap) -> - ?product([t_subst_aux(T, VarMap) || T <- Types]); -t_subst_aux(?tuple(?any, ?any, ?any) = T, _VarMap) -> +t_subst_aux(?function(Domain, Range), Map) -> + ?function(t_subst_aux(Domain, Map), t_subst_aux(Range, Map)); +t_subst_aux(?product(Types), Map) -> + ?product([t_subst_aux(T, Map) || T <- Types]); +t_subst_aux(?tuple(?any, ?any, ?any) = T, _Map) -> T; -t_subst_aux(?tuple(Elements, _Arity, _Tag), VarMap) -> - t_tuple([t_subst_aux(E, VarMap) || E <- Elements]); -t_subst_aux(?tuple_set(_) = TS, VarMap) -> - t_sup([t_subst_aux(T, VarMap) || T <- t_tuple_subtypes(TS)]); -t_subst_aux(?map(Pairs, DefK, DefV), VarMap) -> - t_map([{K, MNess, t_subst_aux(V, VarMap)} || {K, MNess, V} <- Pairs], - t_subst_aux(DefK, VarMap), t_subst_aux(DefV, VarMap)); -t_subst_aux(?opaque(Es), VarMap) -> - List = [Opaque#opaque{args = [t_subst_aux(Arg, VarMap) || Arg <- Args], - struct = t_subst_aux(S, VarMap)} || - Opaque = #opaque{args = Args, struct = S} <- set_to_list(Es)], - ?opaque(ordsets:from_list(List)); -t_subst_aux(?union(List), VarMap) -> - ?union([t_subst_aux(E, VarMap) || E <- List]); -t_subst_aux(T, _VarMap) -> +t_subst_aux(?tuple(Elements, _Arity, _Tag), Map) -> + t_tuple([t_subst_aux(E, Map) || E <- Elements]); +t_subst_aux(?tuple_set(_) = TS, Map) -> + t_sup([t_subst_aux(T, Map) || T <- t_tuple_subtypes(TS)]); +t_subst_aux(?map(Pairs, DefK, DefV), Map) -> + t_map([{K, MNess, t_subst_aux(V, Map)} || {K, MNess, V} <- Pairs], + t_subst_aux(DefK, Map), t_subst_aux(DefV, Map)); +t_subst_aux(?opaque(Es), Map) -> + List = [Opaque#opaque{args = [t_subst_aux(Arg, Map) || Arg <- Args], + struct = t_subst_aux(S, Map)} || + Opaque = #opaque{args = Args, struct = S} <- set_to_list(Es)], + ?opaque(ordsets:from_list(List)); +t_subst_aux(?union(List), Map) -> + ?union([t_subst_aux(E, Map) || E <- List]); +t_subst_aux(T, _Map) -> T. %%----------------------------------------------------------------------------- @@ -3415,33 +3361,33 @@ t_subst_aux(T, _VarMap) -> -spec t_unify(erl_type(), erl_type()) -> t_unify_ret(). t_unify(T1, T2) -> - {T, VarMap} = t_unify(T1, T2, []), - {t_subst_kv(T, VarMap), lists:keysort(1, VarMap)}. + {T, VarMap} = t_unify(T1, T2, #{}), + {t_subst(T, VarMap), lists:keysort(1, maps:to_list(VarMap))}. t_unify(?var(Id) = T, ?var(Id), VarMap) -> {T, VarMap}; t_unify(?var(Id1) = T, ?var(Id2), VarMap) -> - case lists:keyfind(Id1, 1, VarMap) of - false -> - case lists:keyfind(Id2, 1, VarMap) of - false -> {T, [{Id2, T} | VarMap]}; - {Id2, Type} -> t_unify(T, Type, VarMap) + case maps:find(Id1, VarMap) of + error -> + case maps:find(Id2, VarMap) of + error -> {T, VarMap#{Id2 => T}}; + {ok, Type} -> t_unify(T, Type, VarMap) end; - {Id1, Type1} -> - case lists:keyfind(Id2, 1, VarMap) of - false -> {Type1, [{Id2, T} | VarMap]}; - {Id2, Type2} -> t_unify(Type1, Type2, VarMap) + {ok, Type1} -> + case maps:find(Id2, VarMap) of + error -> {Type1, VarMap#{Id2 => T}}; + {ok, Type2} -> t_unify(Type1, Type2, VarMap) end end; t_unify(?var(Id), Type, VarMap) -> - case lists:keyfind(Id, 1, VarMap) of - false -> {Type, [{Id, Type} | VarMap]}; - {Id, VarType} -> t_unify(VarType, Type, VarMap) + case maps:find(Id, VarMap) of + error -> {Type, VarMap#{Id => Type}}; + {ok, VarType} -> t_unify(VarType, Type, VarMap) end; t_unify(Type, ?var(Id), VarMap) -> - case lists:keyfind(Id, 1, VarMap) of - false -> {Type, [{Id, Type} | VarMap]}; - {Id, VarType} -> t_unify(VarType, Type, VarMap) + case maps:find(Id, VarMap) of + error -> {Type, VarMap#{Id => Type}}; + {ok, VarType} -> t_unify(VarType, Type, VarMap) end; t_unify(?function(Domain1, Range1), ?function(Domain2, Range2), VarMap) -> {Domain, VarMap1} = t_unify(Domain1, Domain2, VarMap), @@ -4472,7 +4418,7 @@ mod_name(Mod, Name) -> site(), mod_records()) -> erl_type(). t_from_form(Form, ExpTypes, Site, RecDict) -> - t_from_form(Form, ExpTypes, Site, RecDict, dict:new()). + t_from_form(Form, ExpTypes, Site, RecDict, maps:new()). -spec t_from_form(parse_form(), sets:set(mfa()), site(), mod_records(), var_table()) -> erl_type(). @@ -4489,7 +4435,7 @@ t_from_form_without_remote(Form, Site, TypeTable) -> Module = site_module(Site), RecDict = dict:from_list([{Module, TypeTable}]), ExpTypes = replace_by_none, - {T, _} = t_from_form1(Form, ExpTypes, Site, RecDict, dict:new()), + {T, _} = t_from_form1(Form, ExpTypes, Site, RecDict, maps:new()), T. %% REC_TYPE_LIMIT is used for limiting the depth of recursive types. @@ -4545,7 +4491,7 @@ t_from_form(_, _TypeNames, _ET, _S, _MR, _V, D, L) when D =< 0 ; L =< 0 -> t_from_form({var, _L, '_'}, _TypeNames, _ET, _S, _MR, _V, _D, L) -> {t_any(), L}; t_from_form({var, _L, Name}, _TypeNames, _ET, _S, _MR, V, _D, L) -> - case dict:find(Name, V) of + case maps:find(Name, V) of error -> {t_var(Name), L}; {ok, Val} -> {Val, L} end; @@ -4764,7 +4710,7 @@ type_from_form(Name, Args, TypeNames, ET, Site0, MR, V, D, L) -> {ArgTypes, L1} = list_from_form(Args, TypeNames, ET, Site0, MR, V, D, L), List = lists:zip(ArgNames, ArgTypes), - TmpV = dict:from_list(List), + TmpV = maps:from_list(List), Site = TypeName, t_from_form(Form, NewTypeNames, ET, Site, MR, TmpV, D, L1); false -> @@ -4777,7 +4723,7 @@ type_from_form(Name, Args, TypeNames, ET, Site0, MR, V, D, L) -> {ArgTypes, L1} = list_from_form(Args, NewTypeNames, ET, Site0, MR, V, D, L), List = lists:zip(ArgNames, ArgTypes), - TmpV = dict:from_list(List), + TmpV = maps:from_list(List), Site = TypeName, {Rep, L2} = t_from_form(Form, NewTypeNames, ET, Site, MR, TmpV, D, L1), @@ -4819,7 +4765,7 @@ remote_from_form(RemMod, Name, Args, TypeNames, ET, S, MR, V, D, L) -> {ArgTypes, L1} = list_from_form(Args, TypeNames, ET, S, MR, V, D, L), List = lists:zip(ArgNames, ArgTypes), - TmpVarDict = dict:from_list(List), + TmpVarDict = maps:from_list(List), Site = RemType, t_from_form(Form, NewTypeNames, ET, Site, MR, TmpVarDict, D, L1); @@ -4833,7 +4779,7 @@ remote_from_form(RemMod, Name, Args, TypeNames, ET, S, MR, V, D, L) -> {ArgTypes, L1} = list_from_form(Args, NewTypeNames, ET, S, MR, V, D, L), List = lists:zip(ArgNames, ArgTypes), - TmpVarDict = dict:from_list(List), + TmpVarDict = maps:from_list(List), Site = RemType, {NewRep, L2} = t_from_form(Form, NewTypeNames, ET, Site, MR, @@ -4904,7 +4850,7 @@ record_from_form({atom, _, Name}, ModFields, TypeNames, ET, S, MR, V, D, L) -> {ok, NewFields} -> {NewFields1, L2} = fields_from_form(NewFields, NewTypeNames, ET, S1, MR, - dict:new(), D, L1), + maps:new(), D, L1), Rec = t_tuple( [t_atom(Name)|[Type || {_FieldName, Type} <- NewFields1]]), @@ -5023,7 +4969,7 @@ promote_to_mand(MKs, [E={K,_,V}|T]) -> mod_records()) -> ok. t_check_record_fields(Form, ExpTypes, Site, RecDict) -> - t_check_record_fields(Form, ExpTypes, Site, RecDict, dict:new()). + t_check_record_fields(Form, ExpTypes, Site, RecDict, maps:new()). -spec t_check_record_fields(parse_form(), sets:set(mfa()), site(), mod_records(), var_table()) -> ok. @@ -5192,8 +5138,9 @@ t_form_to_string({type, _L, Name, []} = T) -> D0 = dict:new(), MR = dict:from_list([{M, D0}]), S = {type, {M,Name,0}}, + V = #{}, {T1, _} = - t_from_form(T, [], sets:new(), S, MR, D0, _Deep=1000, _ALot=100000), + t_from_form(T, [], sets:new(), S, MR, V, _Deep=1000, _ALot=100000), t_to_string(T1) catch throw:{error, _} -> atom_to_string(Name) ++ "()" end; diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml index bd6b76a73e..5cebce18a9 100644 --- a/lib/inets/doc/src/notes.xml +++ b/lib/inets/doc/src/notes.xml @@ -33,7 +33,25 @@ <file>notes.xml</file> </header> - <section><title>Inets 6.2.2</title> + <section><title>Inets 6.2.3</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Put back unused module inets_regexp and remove it in OTP + 19 instead as it is an incompatibility, although it is an + undocumented module and should not affect other + applications.</p> + <p> + Own Id: OTP-13533</p> + </item> + </list> + </section> + +</section> + +<section><title>Inets 6.2.2</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/inets/src/inets_app/Makefile b/lib/inets/src/inets_app/Makefile index 1d870c14e8..a294381f67 100644 --- a/lib/inets/src/inets_app/Makefile +++ b/lib/inets/src/inets_app/Makefile @@ -49,7 +49,8 @@ MODULES = \ inets_sup \ inets_trace \ inets_lib \ - inets_time_compat + inets_time_compat \ + inets_regexp INTERNAL_HRL_FILES = inets_internal.hrl EXTERNAL_HRL_FILES = ../../include/httpd.hrl \ diff --git a/lib/inets/src/inets_app/inets.app.src b/lib/inets/src/inets_app/inets.app.src index 5706a335d7..abf8c0cdea 100644 --- a/lib/inets/src/inets_app/inets.app.src +++ b/lib/inets/src/inets_app/inets.app.src @@ -29,6 +29,7 @@ inets_trace, inets_lib, inets_time_compat, + inets_regexp, %% FTP ftp, diff --git a/lib/inets/src/inets_app/inets.appup.src b/lib/inets/src/inets_app/inets.appup.src index a603357ebd..3a31daeb20 100644 --- a/lib/inets/src/inets_app/inets.appup.src +++ b/lib/inets/src/inets_app/inets.appup.src @@ -18,16 +18,10 @@ %% %CopyrightEnd% {"%VSN%", [ - {<<"6.2.1">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}]}, - {<<"6.2">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}, - {load_module, httpc, soft_purge, soft_purge, []}]}, {<<"6\\..*">>,[{restart_application, inets}]}, {<<"5\\..*">>,[{restart_application, inets}]} ], [ - {<<"6.2.1">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}]}, - {<<"6.2">>, [{load_module, httpd_script_env, soft_purge, soft_purge, []}, - {load_module, httpc, soft_purge, soft_purge, []}]}, {<<"6\\..*">>,[{restart_application, inets}]}, {<<"5\\..*">>,[{restart_application, inets}]} ] diff --git a/lib/inets/src/inets_app/inets_regexp.erl b/lib/inets/src/inets_app/inets_regexp.erl new file mode 100644 index 0000000000..fc1608bc5a --- /dev/null +++ b/lib/inets/src/inets_app/inets_regexp.erl @@ -0,0 +1,414 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2009. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +-module(inets_regexp). + +-export([parse/1, match/2, first_match/2, split/2, sub/3, gsub/3]). + + +%%%========================================================================= +%%% API +%%%========================================================================= + +%% parse(RegExp) -> {ok, RE} | {error, E}. +%% Parse the regexp described in the string RegExp. + +parse(S) -> + case (catch reg(S)) of + {R, []} -> + {ok, R}; + {_R, [C|_]} -> + {error, {illegal, [C]}}; + {error, E} -> + {error, E} + end. + + +%% Find the longest match of RegExp in String. + +match(S, RegExp) when is_list(RegExp) -> + case parse(RegExp) of + {ok,RE} -> match(S, RE); + {error,E} -> {error,E} + end; +match(S, RE) -> + case match(RE, S, 1, 0, -1) of + {Start,Len} when Len >= 0 -> + {match, Start, Len}; + {_Start,_Len} -> + nomatch + end. + +%% Find the first match of RegExp in String. + +first_match(S, RegExp) when is_list(RegExp) -> + case parse(RegExp) of + {ok, RE} -> + first_match(S, RE); + {error, E} -> + {error, E} + end; +first_match(S, RE) -> + case first_match(RE, S, 1) of + {Start,Len} when Len >= 0 -> + {match, Start,Len}; + nomatch -> + nomatch + end. + +first_match(RE, S, St) when S =/= [] -> + case re_apply(S, St, RE) of + {match, P, _Rest} -> + {St, P-St}; + nomatch -> + first_match(RE, tl(S), St+1) + end; +first_match(_RE, [], _St) -> + nomatch. + + +match(RE, S, St, Pos, L) -> + case first_match(RE, S, St) of + {St1, L1} -> + Nst = St1 + 1, + if L1 > L -> + match(RE, lists:nthtail(Nst-St, S), Nst, St1, L1); + true -> + match(RE, lists:nthtail(Nst-St, S), Nst, Pos, L) + end; + nomatch -> + {Pos, L} + end. + + +%% Split a string into substrings where the RegExp describes the +%% field seperator. The RegExp " " is specially treated. + +split(String, " ") -> %This is really special + {ok, RE} = parse("[ \t]+"), + case split_apply(String, RE, true) of + [[]|Ss] -> + {ok,Ss}; + Ss -> + {ok,Ss} + end; +split(String, RegExp) when is_list(RegExp) -> + case parse(RegExp) of + {ok, RE} -> + {ok, split_apply(String, RE, false)}; + {error, E} -> + {error,E} + end; +split(String, RE) -> + {ok, split_apply(String, RE, false)}. + + +%% Substitute the first match of the regular expression RegExp +%% with the string Replace in String. Accept pre-parsed regular +%% expressions. + +sub(String, RegExp, Rep) when is_list(RegExp) -> + case parse(RegExp) of + {ok, RE} -> + sub(String, RE, Rep); + {error, E} -> + {error, E} + end; +sub(String, RE, Rep) -> + Ss = sub_match(String, RE, 1), + {ok, sub_repl(Ss, Rep, String, 1), length(Ss)}. + + +%% Substitute every match of the regular expression RegExp with +%% the string New in String. Accept pre-parsed regular expressions. + +gsub(String, RegExp, Rep) when is_list(RegExp) -> + case parse(RegExp) of + {ok, RE} -> + gsub(String, RE, Rep); + {error, E} -> + {error, E} + end; +gsub(String, RE, Rep) -> + Ss = matches(String, RE, 1), + {ok, sub_repl(Ss, Rep, String, 1), length(Ss)}. + + +%%%======================================================================== +%%% Internal functions +%%%======================================================================== + +%% This is the regular expression grammar used. It is equivalent to the +%% one used in AWK, except that we allow ^ $ to be used anywhere and fail +%% in the matching. +%% +%% reg -> reg1 : '$1'. +%% reg1 -> reg1 "|" reg2 : {'or','$1','$2'}. +%% reg1 -> reg2 : '$1'. +%% reg2 -> reg2 reg3 : {concat,'$1','$2'}. +%% reg2 -> reg3 : '$1'. +%% reg3 -> reg3 "*" : {kclosure,'$1'}. +%% reg3 -> reg3 "+" : {pclosure,'$1'}. +%% reg3 -> reg3 "?" : {optional,'$1'}. +%% reg3 -> reg4 : '$1'. +%% reg4 -> "(" reg ")" : '$2'. +%% reg4 -> "\\" char : '$2'. +%% reg4 -> "^" : bos. +%% reg4 -> "$" : eos. +%% reg4 -> "." : char. +%% reg4 -> "[" class "]" : {char_class,char_class('$2')} +%% reg4 -> "[" "^" class "]" : {comp_class,char_class('$3')} +%% reg4 -> "\"" chars "\"" : char_string('$2') +%% reg4 -> char : '$1'. +%% reg4 -> empty : epsilon. +%% The grammar of the current regular expressions. The actual parser +%% is a recursive descent implementation of the grammar. + +reg(S) -> reg1(S). + +%% reg1 -> reg2 reg1' +%% reg1' -> "|" reg2 +%% reg1' -> empty + +reg1(S0) -> + {L,S1} = reg2(S0), + reg1p(S1, L). + +reg1p([$||S0], L) -> + {R,S1} = reg2(S0), + reg1p(S1, {'or',L,R}); +reg1p(S, L) -> {L,S}. + +%% reg2 -> reg3 reg2' +%% reg2' -> reg3 +%% reg2' -> empty + +reg2(S0) -> + {L,S1} = reg3(S0), + reg2p(S1, L). + +reg2p([C|S0], L) when (C =/= $|) andalso (C =/= $)) -> + {R,S1} = reg3([C|S0]), + reg2p(S1, {concat,L,R}); +reg2p(S, L) -> {L,S}. + +%% reg3 -> reg4 reg3' +%% reg3' -> "*" reg3' +%% reg3' -> "+" reg3' +%% reg3' -> "?" reg3' +%% reg3' -> empty + +reg3(S0) -> + {L,S1} = reg4(S0), + reg3p(S1, L). + +reg3p([$*|S], L) -> reg3p(S, {kclosure,L}); +reg3p([$+|S], L) -> reg3p(S, {pclosure,L}); +reg3p([$?|S], L) -> reg3p(S, {optional,L}); +reg3p(S, L) -> {L,S}. + +reg4([$(|S0]) -> + case reg(S0) of + {R,[$)|S1]} -> {R,S1}; + {_R,_S} -> throw({error,{unterminated,"("}}) + end; +reg4([$\\,O1,O2,O3|S]) + when ((O1 >= $0) andalso + (O1 =< $7) andalso + (O2 >= $0) andalso + (O2 =< $7) andalso + (O3 >= $0) andalso + (O3 =< $7)) -> + {(O1*8 + O2)*8 + O3 - 73*$0,S}; +reg4([$\\,C|S]) -> + {escape_char(C),S}; +reg4([$\\]) -> + throw({error, {unterminated,"\\"}}); +reg4([$^|S]) -> + {bos,S}; +reg4([$$|S]) -> + {eos,S}; +reg4([$.|S]) -> + {{comp_class,"\n"},S}; +reg4("[^" ++ S0) -> + case char_class(S0) of + {Cc,[$]|S1]} -> {{comp_class,Cc},S1}; + {_Cc,_S} -> throw({error,{unterminated,"["}}) + end; +reg4([$[|S0]) -> + case char_class(S0) of + {Cc,[$]|S1]} -> {{char_class,Cc},S1}; + {_Cc,_S1} -> throw({error,{unterminated,"["}}) + end; +reg4([C|S]) + when (C =/= $*) andalso (C =/= $+) andalso (C =/= $?) andalso (C =/= $]) -> + {C, S}; +reg4([C|_S]) -> + throw({error,{illegal,[C]}}); +reg4([]) -> + {epsilon,[]}. + +escape_char($n) -> $\n; %\n = LF +escape_char($r) -> $\r; %\r = CR +escape_char($t) -> $\t; %\t = TAB +escape_char($v) -> $\v; %\v = VT +escape_char($b) -> $\b; %\b = BS +escape_char($f) -> $\f; %\f = FF +escape_char($e) -> $\e; %\e = ESC +escape_char($s) -> $\s; %\s = SPACE +escape_char($d) -> $\d; %\d = DEL +escape_char(C) -> C. + +char_class([$]|S]) -> char_class(S, [$]]); +char_class(S) -> char_class(S, []). + +char($\\, [O1,O2,O3|S]) when + O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 -> + {(O1*8 + O2)*8 + O3 - 73*$0,S}; +char($\\, [C|S]) -> {escape_char(C),S}; +char(C, S) -> {C,S}. + +char_class([C1|S0], Cc) when C1 =/= $] -> + case char(C1, S0) of + {Cf,[$-,C2|S1]} when C2 =/= $] -> + case char(C2, S1) of + {Cl,S2} when Cf < Cl -> char_class(S2, [{Cf,Cl}|Cc]); + {Cl,_S2} -> throw({error,{char_class,[Cf,$-,Cl]}}) + end; + {C,S1} -> char_class(S1, [C|Cc]) + end; +char_class(S, Cc) -> {Cc,S}. + + +%% re_apply(String, StartPos, RegExp) -> re_app_res(). +%% +%% Apply the (parse of the) regular expression RegExp to String. If +%% there is a match return the position of the remaining string and +%% the string if else return 'nomatch'. BestMatch specifies if we want +%% the longest match, or just a match. +%% +%% StartPos should be the real start position as it is used to decide +%% if we ae at the beginning of the string. +%% +%% Pass two functions to re_apply_or so it can decide, on the basis +%% of BestMatch, whether to just any take any match or try both to +%% find the longest. This is slower but saves duplicatng code. + +re_apply(S, St, RE) -> re_apply(RE, [], S, St). + +re_apply(epsilon, More, S, P) -> %This always matches + re_apply_more(More, S, P); +re_apply({'or',RE1,RE2}, More, S, P) -> + re_apply_or(re_apply(RE1, More, S, P), + re_apply(RE2, More, S, P)); +re_apply({concat,RE1,RE2}, More, S0, P) -> + re_apply(RE1, [RE2|More], S0, P); +re_apply({kclosure,CE}, More, S, P) -> + %% Be careful with the recursion, explicitly do one call before + %% looping. + re_apply_or(re_apply_more(More, S, P), + re_apply(CE, [{kclosure,CE}|More], S, P)); +re_apply({pclosure,CE}, More, S, P) -> + re_apply(CE, [{kclosure,CE}|More], S, P); +re_apply({optional,CE}, More, S, P) -> + re_apply_or(re_apply_more(More, S, P), + re_apply(CE, More, S, P)); +re_apply(bos, More, S, 1) -> re_apply_more(More, S, 1); +re_apply(eos, More, [$\n|S], P) -> re_apply_more(More, S, P); +re_apply(eos, More, [], P) -> re_apply_more(More, [], P); +re_apply({char_class,Cc}, More, [C|S], P) -> + case in_char_class(C, Cc) of + true -> re_apply_more(More, S, P+1); + false -> nomatch + end; +re_apply({comp_class,Cc}, More, [C|S], P) -> + case in_char_class(C, Cc) of + true -> nomatch; + false -> re_apply_more(More, S, P+1) + end; +re_apply(C, More, [C|S], P) when is_integer(C) -> + re_apply_more(More, S, P+1); +re_apply(_RE, _More, _S, _P) -> nomatch. + +%% re_apply_more([RegExp], String, Length) -> re_app_res(). + +re_apply_more([RE|More], S, P) -> re_apply(RE, More, S, P); +re_apply_more([], S, P) -> {match,P,S}. + +%% in_char_class(Char, Class) -> bool(). + +in_char_class(C, [{C1,C2}|_Cc]) when C >= C1, C =< C2 -> true; +in_char_class(C, [C|_Cc]) -> true; +in_char_class(C, [_|Cc]) -> in_char_class(C, Cc); +in_char_class(_C, []) -> false. + +%% re_apply_or(Match1, Match2) -> re_app_res(). +%% If we want the best match then choose the longest match, else just +%% choose one by trying sequentially. + +re_apply_or({match,P1,S1}, {match,P2,_S2}) when P1 >= P2 -> {match,P1,S1}; +re_apply_or({match,_P1,_S1}, {match,P2,S2}) -> {match,P2,S2}; +re_apply_or(nomatch, R2) -> R2; +re_apply_or(R1, nomatch) -> R1. + + +matches(S, RE, St) -> + case first_match(RE, S, St) of + {St1,0} -> + [{St1,0}|matches(string:substr(S, St1+2-St), RE, St1+1)]; + {St1,L1} -> + [{St1,L1}|matches(string:substr(S, St1+L1+1-St), RE, St1+L1)]; + nomatch -> + [] + end. + +sub_match(S, RE, St) -> + case first_match(RE, S, St) of + {St1,L1} -> [{St1,L1}]; + nomatch -> [] + end. + +sub_repl([{St,L}|Ss], Rep, S, Pos) -> + Rs = sub_repl(Ss, Rep, S, St+L), + string:substr(S, Pos, St-Pos) ++ + sub_repl(Rep, string:substr(S, St, L), Rs); +sub_repl([], _Rep, S, Pos) -> + string:substr(S, Pos). + +sub_repl([$&|Rep], M, Rest) -> M ++ sub_repl(Rep, M, Rest); +sub_repl("\\&" ++ Rep, M, Rest) -> [$&|sub_repl(Rep, M, Rest)]; +sub_repl([C|Rep], M, Rest) -> [C|sub_repl(Rep, M, Rest)]; +sub_repl([], _M, Rest) -> Rest. + +split_apply(S, RE, Trim) -> split_apply(S, 1, RE, Trim, []). + +split_apply([], _P, _RE, true, []) -> + []; +split_apply([], _P, _RE, _T, Sub) -> + [lists:reverse(Sub)]; +split_apply(S, P, RE, T, Sub) -> + case re_apply(S, P, RE) of + {match,P,_Rest} -> + split_apply(tl(S), P+1, RE, T, [hd(S)|Sub]); + {match,P1,Rest} -> + [lists:reverse(Sub)|split_apply(Rest, P1, RE, T, [])]; + nomatch -> + split_apply(tl(S), P+1, RE, T, [hd(S)|Sub]) + end. diff --git a/lib/inets/vsn.mk b/lib/inets/vsn.mk index fc33b546d9..ef985f7c4e 100644 --- a/lib/inets/vsn.mk +++ b/lib/inets/vsn.mk @@ -18,7 +18,6 @@ # # %CopyrightEnd% -APPLICATION = inets -INETS_VSN = 6.2.2 +INETS_VSN = 6.3 PRE_VSN = APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)" diff --git a/lib/jinterface/java_src/pom.xml.src b/lib/jinterface/java_src/pom.xml.src index cef49b735a..98232db78c 100644 --- a/lib/jinterface/java_src/pom.xml.src +++ b/lib/jinterface/java_src/pom.xml.src @@ -7,14 +7,14 @@ <version>%VSN%</version> <name>jinterface</name> <description> - Jinterface Java package contains java classes, which help you integrate programs written in Java with Erlang. + Jinterface Java package contains java classes, which help you integrate programs written in Java with Erlang. Erlang is a programming language designed at the Ericsson Computer Science Laboratory. - </description> + </description> <url>http://erlang.org/</url> <licenses> <license> - <name>ERLANG PUBLIC LICENSE 1.1</name> - <url>http://www.erlang.org/EPLICENSE</url> + <name>Apache License 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> <distribution>repo</distribution> </license> </licenses> @@ -37,14 +37,16 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> + <version>3.5.1</version> <configuration> - <source>1.5</source> - <target>1.5</target> + <source>1.6</source> + <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> + <version>1.10</version> <executions> <execution> <phase>generate-sources</phase> @@ -59,6 +61,32 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>3.0.0</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar-no-fork</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.10.3</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> <distributionManagement> @@ -85,7 +113,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>1.0-alpha-4</version> + <version>1.6</version> <executions> <execution> <id>sign-artifacts</id> diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl index 90b2a06c46..6174136507 100644 --- a/lib/kernel/src/code_server.erl +++ b/lib/kernel/src/code_server.erl @@ -32,7 +32,12 @@ -import(lists, [foreach/2]). --type on_load_item() :: {reference(),module(),file:name_all(),[pid()]}. +-type on_load_action() :: + fun((term(), state()) -> {'reply',term(),state()} | + {'noreply',state()}). + +-type on_load_item() :: {{pid(),reference()},module(), + [{pid(),on_load_action()}]}. -record(state, {supervisor :: pid(), root :: file:name_all(), @@ -142,7 +147,7 @@ reply(Pid, Res) -> loop(#state{supervisor=Supervisor}=State0) -> receive {code_call, Pid, Req} -> - case handle_call(Req, {Pid, call}, State0) of + case handle_call(Req, Pid, State0) of {reply, Res, State} -> _ = reply(Pid, Res), loop(State); @@ -155,8 +160,8 @@ loop(#state{supervisor=Supervisor}=State0) -> system_terminate(Reason, Supervisor, [], State0); {system, From, Msg} -> handle_system_msg(running,Msg, From, Supervisor, State0); - {'DOWN',Ref,process,_,Res} -> - State = finish_on_load(Ref, Res, State0), + {'DOWN',Ref,process,Pid,Res} -> + State = finish_on_load({Pid,Ref}, Res, State0), loop(State); _Msg -> loop(State0) @@ -225,90 +230,90 @@ system_code_change(State, _Module, _OldVsn, _Extra) -> %% The gen_server call back functions. %% -handle_call({stick_dir,Dir}, {_From,_Tag}, S) -> +handle_call({stick_dir,Dir}, _From, S) -> {reply,stick_dir(Dir, true, S),S}; -handle_call({unstick_dir,Dir}, {_From,_Tag}, S) -> +handle_call({unstick_dir,Dir}, _From, S) -> {reply,stick_dir(Dir, false, S),S}; -handle_call({stick_mod,Mod}, {_From,_Tag}, S) -> +handle_call({stick_mod,Mod}, _From, S) -> {reply,stick_mod(Mod, true, S),S}; -handle_call({unstick_mod,Mod}, {_From,_Tag}, S) -> +handle_call({unstick_mod,Mod}, _From, S) -> {reply,stick_mod(Mod, false, S),S}; -handle_call({dir,Dir}, {_From,_Tag}, S) -> +handle_call({dir,Dir}, _From, S) -> Root = S#state.root, Resp = do_dir(Root,Dir,S#state.namedb), {reply,Resp,S}; -handle_call({load_file,Mod}, Caller, St) when is_atom(Mod) -> - load_file(Mod, Caller, St); +handle_call({load_file,Mod}, From, St) when is_atom(Mod) -> + load_file(Mod, From, St); -handle_call({add_path,Where,Dir0}, {_From,_Tag}, +handle_call({add_path,Where,Dir0}, _From, #state{namedb=Namedb,path=Path0}=S) -> {Resp,Path} = add_path(Where, Dir0, Path0, Namedb), {reply,Resp,S#state{path=Path}}; -handle_call({add_paths,Where,Dirs0}, {_From,_Tag}, +handle_call({add_paths,Where,Dirs0}, _From, #state{namedb=Namedb,path=Path0}=S) -> {Resp,Path} = add_paths(Where, Dirs0, Path0, Namedb), {reply,Resp,S#state{path=Path}}; -handle_call({set_path,PathList}, {_From,_Tag}, +handle_call({set_path,PathList}, _From, #state{path=Path0,namedb=Namedb}=S) -> {Resp,Path,NewDb} = set_path(PathList, Path0, Namedb), {reply,Resp,S#state{path=Path,namedb=NewDb}}; -handle_call({del_path,Name}, {_From,_Tag}, +handle_call({del_path,Name}, _From, #state{path=Path0,namedb=Namedb}=S) -> {Resp,Path} = del_path(Name, Path0, Namedb), {reply,Resp,S#state{path=Path}}; -handle_call({replace_path,Name,Dir}, {_From,_Tag}, +handle_call({replace_path,Name,Dir}, _From, #state{path=Path0,namedb=Namedb}=S) -> {Resp,Path} = replace_path(Name, Dir, Path0, Namedb), {reply,Resp,S#state{path=Path}}; -handle_call(get_path, {_From,_Tag}, S) -> +handle_call(get_path, _From, S) -> {reply,S#state.path,S}; %% Messages to load, delete and purge modules/files. -handle_call({load_abs,File,Mod}, Caller, S) when is_atom(Mod) -> +handle_call({load_abs,File,Mod}, From, S) when is_atom(Mod) -> case modp(File) of false -> {reply,{error,badarg},S}; true -> - load_abs(File, Mod, Caller, S) + load_abs(File, Mod, From, S) end; -handle_call({load_binary,Mod,File,Bin}, Caller, S) when is_atom(Mod) -> - do_load_binary(Mod, File, Bin, Caller, S); +handle_call({load_binary,Mod,File,Bin}, From, S) when is_atom(Mod) -> + do_load_binary(Mod, File, Bin, From, S); -handle_call({load_native_partial,Mod,Bin}, {_From,_Tag}, S) -> +handle_call({load_native_partial,Mod,Bin}, _From, S) -> Architecture = erlang:system_info(hipe_architecture), Result = (catch hipe_unified_loader:load(Mod, Bin, Architecture)), Status = hipe_result_to_status(Result, S), {reply,Status,S}; -handle_call({load_native_sticky,Mod,Bin,WholeModule}, {_From,_Tag}, S) -> +handle_call({load_native_sticky,Mod,Bin,WholeModule}, _From, S) -> Architecture = erlang:system_info(hipe_architecture), Result = (catch hipe_unified_loader:load_module(Mod, Bin, WholeModule, Architecture)), Status = hipe_result_to_status(Result, S), {reply,Status,S}; -handle_call({ensure_loaded,Mod}, Caller, St) when is_atom(Mod) -> +handle_call({ensure_loaded,Mod}, From, St) when is_atom(Mod) -> case erlang:module_loaded(Mod) of true -> {reply,{module,Mod},St}; false when St#state.mode =:= interactive -> - load_file(Mod, Caller, St); + ensure_loaded(Mod, From, St); false -> {reply,{error,embedded},St} end; -handle_call({delete,Mod}, {_From,_Tag}, St) when is_atom(Mod) -> +handle_call({delete,Mod}, _From, St) when is_atom(Mod) -> case catch erlang:delete_module(Mod) of true -> ets:delete(St#state.moddb, Mod), @@ -317,48 +322,50 @@ handle_call({delete,Mod}, {_From,_Tag}, St) when is_atom(Mod) -> {reply,false,St} end; -handle_call({purge,Mod}, {_From,_Tag}, St) when is_atom(Mod) -> +handle_call({purge,Mod}, _From, St) when is_atom(Mod) -> {reply,do_purge(Mod),St}; -handle_call({soft_purge,Mod}, {_From,_Tag}, St) when is_atom(Mod) -> +handle_call({soft_purge,Mod}, _From, St) when is_atom(Mod) -> {reply,do_soft_purge(Mod),St}; -handle_call({is_loaded,Mod}, {_From,_Tag}, St) when is_atom(Mod) -> +handle_call({is_loaded,Mod}, _From, St) when is_atom(Mod) -> {reply,is_loaded(Mod, St#state.moddb),St}; -handle_call(all_loaded, {_From,_Tag}, S) -> +handle_call(all_loaded, _From, S) -> Db = S#state.moddb, {reply,all_loaded(Db),S}; -handle_call({get_object_code,Mod}, {_From,_Tag}, St) when is_atom(Mod) -> +handle_call({get_object_code,Mod}, _From, St) when is_atom(Mod) -> Path = St#state.path, case mod_to_bin(Path, Mod) of {_,Bin,FName} -> {reply,{Mod,Bin,FName},St}; Error -> {reply,Error,St} end; -handle_call({is_sticky, Mod}, {_From,_Tag}, S) -> +handle_call({is_sticky, Mod}, _From, S) -> Db = S#state.moddb, {reply, is_sticky(Mod,Db), S}; -handle_call(stop,{_From,_Tag}, S) -> +handle_call(stop,_From, S) -> {stop,normal,stopped,S}; -handle_call({set_primary_archive, File, ArchiveBin, FileInfo, ParserFun}, {_From,_Tag}, S=#state{mode=Mode}) -> - case erl_prim_loader:set_primary_archive(File, ArchiveBin, FileInfo, ParserFun) of +handle_call({set_primary_archive, File, ArchiveBin, FileInfo, ParserFun}, + _From, S=#state{mode=Mode}) -> + case erl_prim_loader:set_primary_archive(File, ArchiveBin, FileInfo, + ParserFun) of {ok, Files} -> {reply, {ok, Mode, Files}, S}; {error, _Reason} = Error -> {reply, Error, S} end; -handle_call(get_mode, {_From,_Tag}, S=#state{mode=Mode}) -> +handle_call(get_mode, _From, S=#state{mode=Mode}) -> {reply, Mode, S}; -handle_call({finish_loading,Prepared,EnsureLoaded}, {_,_}, S) -> +handle_call({finish_loading,Prepared,EnsureLoaded}, _From, S) -> {reply,finish_loading(Prepared, EnsureLoaded, S),S}; -handle_call(Other,{_From,_Tag}, S) -> +handle_call(Other,_From, S) -> error_msg(" ** Codeserver*** ignoring ~w~n ",[Other]), {noreply,S}. @@ -1054,14 +1061,14 @@ add_paths(Where,[Dir|Tail],Path,NameDb) -> add_paths(_,_,Path,_) -> {ok,Path}. -do_load_binary(Module, File, Binary, Caller, St) -> +do_load_binary(Module, File, Binary, From, St) -> case modp(File) andalso is_binary(Binary) of true -> case erlang:module_loaded(Module) of true -> do_purge(Module); false -> ok end, - try_load_module(File, Module, Binary, Caller, St); + try_load_module(File, Module, Binary, From, St); false -> {reply,{error,badarg},St} end. @@ -1070,63 +1077,61 @@ modp(Atom) when is_atom(Atom) -> true; modp(List) when is_list(List) -> int_list(List); modp(_) -> false. -load_abs(File, Mod, Caller, St) -> +load_abs(File, Mod, From, St) -> Ext = objfile_extension(), FileName0 = lists:concat([File, Ext]), FileName = absname(FileName0), case erl_prim_loader:get_file(FileName) of {ok,Bin,_} -> - try_load_module(FileName, Mod, Bin, Caller, St); + try_load_module(FileName, Mod, Bin, From, St); error -> {reply,{error,nofile},St} end. -try_load_module(File, Mod, Bin, {From,_}=Caller, St0) -> - case pending_on_load(Mod, From, St0) of - no -> - try_load_module_1(File, Mod, Bin, Caller, St0); - {yes,St} -> - {noreply,St} - end. +try_load_module(File, Mod, Bin, From, St) -> + Action = fun(_, S) -> + try_load_module_1(File, Mod, Bin, From, S) + end, + handle_pending_on_load(Action, Mod, From, St). -try_load_module_1(File, Mod, Bin, Caller, #state{moddb=Db}=St) -> +try_load_module_1(File, Mod, Bin, From, #state{moddb=Db}=St) -> case is_sticky(Mod, Db) of true -> %% Sticky file reject the load error_msg("Can't load module '~w' that resides in sticky dir\n",[Mod]), {reply,{error,sticky_directory},St}; false -> Architecture = erlang:system_info(hipe_architecture), - try_load_module_2(File, Mod, Bin, Caller, Architecture, St) + try_load_module_2(File, Mod, Bin, From, Architecture, St) end. -try_load_module_2(File, Mod, Bin, Caller, undefined, St) -> - try_load_module_3(File, Mod, Bin, Caller, undefined, St); -try_load_module_2(File, Mod, Bin, Caller, Architecture, +try_load_module_2(File, Mod, Bin, From, undefined, St) -> + try_load_module_3(File, Mod, Bin, From, undefined, St); +try_load_module_2(File, Mod, Bin, From, Architecture, #state{moddb=Db}=St) -> case catch hipe_unified_loader:load_native_code(Mod, Bin, Architecture) of {module,Mod} = Module -> ets:insert(Db, [{{native,Mod},true},{Mod,File}]), {reply,Module,St}; no_native -> - try_load_module_3(File, Mod, Bin, Caller, Architecture, St); + try_load_module_3(File, Mod, Bin, From, Architecture, St); Error -> error_msg("Native loading of ~ts failed: ~p\n", [File,Error]), {reply,ok,St} end. -try_load_module_3(File, Mod, Bin, Caller, Architecture, - #state{moddb=Db}=St) -> - case erlang:load_module(Mod, Bin) of - {module,Mod} = Module -> - ets:insert(Db, {Mod,File}), - post_beam_load([Mod], Architecture, St), - {reply,Module,St}; - {error,on_load} -> - handle_on_load(Mod, File, Caller, St); - {error,What} = Error -> - error_msg("Loading of ~ts failed: ~p\n", [File, What]), - {reply,Error,St} - end. +try_load_module_3(File, Mod, Bin, From, Architecture, St0) -> + Action = fun({module,_}=Module, #state{moddb=Db}=S) -> + ets:insert(Db, {Mod,File}), + post_beam_load([Mod], Architecture, S), + {reply,Module,S}; + ({error,on_load_failure}=Error, S) -> + {reply,Error,S}; + ({error,What}=Error, S) -> + error_msg("Loading of ~ts failed: ~p\n", [File, What]), + {reply,Error,S} + end, + Res = erlang:load_module(Mod, Bin), + handle_on_load(Res, Action, Mod, From, St0). hipe_result_to_status(Result, #state{moddb=Db}) -> case Result of @@ -1151,18 +1156,29 @@ int_list([H|T]) when is_integer(H) -> int_list(T); int_list([_|_]) -> false; int_list([]) -> true. -load_file(Mod, {From,_}=Caller, St0) -> - case pending_on_load(Mod, From, St0) of - no -> load_file_1(Mod, Caller, St0); - {yes,St} -> {noreply,St} - end. - -load_file_1(Mod, Caller, #state{path=Path}=St) -> +ensure_loaded(Mod, From, St0) -> + Action = fun(_, S) -> + case erlang:module_loaded(Mod) of + true -> + {reply,{module,Mod},S}; + false -> + load_file_1(Mod, From, S) + end + end, + handle_pending_on_load(Action, Mod, From, St0). + +load_file(Mod, From, St0) -> + Action = fun(_, S) -> + load_file_1(Mod, From, S) + end, + handle_pending_on_load(Action, Mod, From, St0). + +load_file_1(Mod, From, #state{path=Path}=St) -> case mod_to_bin(Path, Mod) of error -> {reply,{error,nofile},St}; {Mod,Binary,File} -> - try_load_module_1(File, Mod, Binary, Caller, St) + try_load_module_1(File, Mod, Binary, From, St) end. mod_to_bin([Dir|Tail], Mod) -> @@ -1305,59 +1321,78 @@ run([F|Fs], Data0) -> %% The on_load functionality. %% ------------------------------------------------------- -handle_on_load(Mod, File, {From,_}, #state{on_load=OnLoad0}=St0) -> +handle_on_load({error,on_load}, Action, Mod, From, St0) -> + #state{on_load=OnLoad0} = St0, Fun = fun() -> Res = erlang:call_on_load_function(Mod), exit(Res) end, - {_,Ref} = spawn_monitor(Fun), - OnLoad = [{Ref,Mod,File,[From]}|OnLoad0], + PidRef = spawn_monitor(Fun), + PidAction = {From,Action}, + OnLoad = [{PidRef,Mod,[PidAction]}|OnLoad0], St = St0#state{on_load=OnLoad}, - {noreply,St}. + {noreply,St}; +handle_on_load(Res, Action, _, _, St) -> + Action(Res, St). -pending_on_load(_, _, #state{on_load=[]}) -> - no; -pending_on_load(Mod, From, #state{on_load=OnLoad0}=St) -> - case lists:keymember(Mod, 2, OnLoad0) of +handle_pending_on_load(Action, Mod, From, #state{on_load=OnLoad0}=St) -> + case lists:keyfind(Mod, 2, OnLoad0) of false -> - no; - true -> - OnLoad = pending_on_load_1(Mod, From, OnLoad0), - {yes,St#state{on_load=OnLoad}} + Action(ok, St); + {{From,_Ref},Mod,_Pids} -> + %% The on_load function tried to make an external + %% call to its own module. That would be a deadlock. + %% Fail the call. (The call is probably from error_handler, + %% and it will ignore the actual error reason and cause + %% an undef execption.) + {reply,{error,deadlock},St}; + {_,_,_} -> + OnLoad = handle_pending_on_load_1(Mod, {From,Action}, OnLoad0), + {noreply,St#state{on_load=OnLoad}} end. -pending_on_load_1(Mod, From, [{Ref,Mod,File,Pids}|T]) -> - [{Ref,Mod,File,[From|Pids]}|T]; -pending_on_load_1(Mod, From, [H|T]) -> - [H|pending_on_load_1(Mod, From, T)]; -pending_on_load_1(_, _, []) -> []. +handle_pending_on_load_1(Mod, From, [{PidRef,Mod,Pids}|T]) -> + [{PidRef,Mod,[From|Pids]}|T]; +handle_pending_on_load_1(Mod, From, [H|T]) -> + [H|handle_pending_on_load_1(Mod, From, T)]; +handle_pending_on_load_1(_, _, []) -> []. -finish_on_load(Ref, OnLoadRes, #state{on_load=OnLoad0,moddb=Db}=State) -> - case lists:keyfind(Ref, 1, OnLoad0) of +finish_on_load(PidRef, OnLoadRes, #state{on_load=OnLoad0}=St0) -> + case lists:keyfind(PidRef, 1, OnLoad0) of false -> %% Since this process in general silently ignores messages %% it doesn't understand, it should also ignore a 'DOWN' %% message with an unknown reference. - State; - {Ref,Mod,File,WaitingPids} -> - finish_on_load_1(Mod, File, OnLoadRes, WaitingPids, Db), - OnLoad = [E || {R,_,_,_}=E <- OnLoad0, R =/= Ref], - State#state{on_load=OnLoad} + St0; + {PidRef,Mod,Waiting} -> + St = finish_on_load_1(Mod, OnLoadRes, Waiting, St0), + OnLoad = [E || {R,_,_}=E <- OnLoad0, R =/= PidRef], + St#state{on_load=OnLoad} end. -finish_on_load_1(Mod, File, OnLoadRes, WaitingPids, Db) -> +finish_on_load_1(Mod, OnLoadRes, Waiting, St) -> Keep = OnLoadRes =:= ok, erlang:finish_after_on_load(Mod, Keep), Res = case Keep of false -> _ = finish_on_load_report(Mod, OnLoadRes), + _ = erts_code_purger:purge(Mod), {error,on_load_failure}; true -> - ets:insert(Db, {Mod,File}), {module,Mod} end, - _ = [reply(Pid, Res) || Pid <- WaitingPids], - ok. + finish_on_load_2(Waiting, Res, St). + +finish_on_load_2([{Pid,Action}|T], Res, St0) -> + case Action(Res, St0) of + {reply,Rep,St} -> + _ = reply(Pid, Rep), + finish_on_load_2(T, Res, St); + {noreply,St} -> + finish_on_load_2(T, Res, St) + end; +finish_on_load_2([], _, St) -> + St. finish_on_load_report(_Mod, Atom) when is_atom(Atom) -> %% No error reports for atoms. diff --git a/lib/kernel/src/dist_util.erl b/lib/kernel/src/dist_util.erl index 580a896357..47d0c1b861 100644 --- a/lib/kernel/src/dist_util.erl +++ b/lib/kernel/src/dist_util.erl @@ -156,7 +156,7 @@ is_allowed(#hs_data{other_node = Node, send_status(HSData, not_allowed), error_msg("** Connection attempt from " "disallowed node ~w ** ~n", [Node]), - ?shutdown(Node); + ?shutdown2(Node, {is_allowed, not_allowed}); _ -> true end. @@ -607,10 +607,10 @@ recv_challenge_reply(#hs_data{socket = Socket, _ -> error_msg("** Connection attempt from " "disallowed node ~w ** ~n", [NodeB]), - ?shutdown(NodeB) + ?shutdown2(NodeB, {recv_challenge_reply_failed, bad_cookie}) end; - _ -> - ?shutdown(no_node) + Other -> + ?shutdown2(no_node, {recv_challenge_reply_failed, Other}) end. recv_challenge_ack(#hs_data{socket = Socket, f_recv = FRecv, diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl index 6f9ce17c0c..21bff02214 100644 --- a/lib/kernel/src/rpc.erl +++ b/lib/kernel/src/rpc.erl @@ -63,7 +63,7 @@ %%------------------------------------------------------------------------ --type state() :: gb_trees:tree(pid(), {pid(), reference()}). +-type state() :: map(). %%------------------------------------------------------------------------ @@ -91,7 +91,7 @@ stop(Rpc) -> init([]) -> process_flag(trap_exit, true), - {ok, gb_trees:empty()}. + {ok, maps:new()}. -spec handle_call(term(), term(), state()) -> {'noreply', state()} | @@ -130,29 +130,15 @@ handle_cast(_, S) -> -spec handle_info(term(), state()) -> {'noreply', state()}. +handle_info({'DOWN', _, process, Caller, normal}, S) -> + {noreply, maps:remove(Caller, S)}; handle_info({'DOWN', _, process, Caller, Reason}, S) -> - case gb_trees:lookup(Caller, S) of - {value, To} -> - receive - {Caller, {reply, Reply}} -> - gen_server:reply(To, Reply) - after 0 -> - gen_server:reply(To, {badrpc, {'EXIT', Reason}}) - end, - {noreply, gb_trees:delete(Caller, S)}; - none -> - {noreply, S} - end; -handle_info({Caller, {reply, Reply}}, S) -> - case gb_trees:lookup(Caller, S) of - {value, To} -> - receive - {'DOWN', _, process, Caller, _} -> - gen_server:reply(To, Reply), - {noreply, gb_trees:delete(Caller, S)} - end; - none -> - {noreply, S} + case maps:get(Caller, S, undefined) of + undefined -> + {noreply, S}; + {_, _} = To -> + gen_server:reply(To, {badrpc, {'EXIT', Reason}}), + {noreply, maps:remove(Caller, S)} end; handle_info({From, {sbcast, Name, Msg}}, S) -> _ = case catch Name ! Msg of %% use catch to get the printout @@ -190,7 +176,6 @@ code_change(_, S, _) -> %% Auxiliary function to avoid a false dialyzer warning -- do not inline %% handle_call_call(Mod, Fun, Args, Gleader, To, S) -> - RpcServer = self(), %% Spawn not to block the rpc server. {Caller,_} = erlang:spawn_monitor( @@ -205,9 +190,9 @@ handle_call_call(Mod, Fun, Args, Gleader, To, S) -> Result -> Result end, - RpcServer ! {self(), {reply, Reply}} + gen_server:reply(To, Reply) end), - {noreply, gb_trees:insert(Caller, To, S)}. + {noreply, maps:put(Caller, To, S)}. %% RPC aid functions .... diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl index 383eab94fe..8da67c89f8 100644 --- a/lib/kernel/test/code_SUITE.erl +++ b/lib/kernel/test/code_SUITE.erl @@ -20,6 +20,7 @@ -module(code_SUITE). -include_lib("common_test/include/ct.hrl"). +-include_lib("syntax_tools/include/merl.hrl"). -export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]). -export([set_path/1, get_path/1, add_path/1, add_paths/1, del_path/1, @@ -33,7 +34,9 @@ where_is_file/1, purge_stacktrace/1, mult_lib_roots/1, bad_erl_libs/1, code_archive/1, code_archive2/1, on_load/1, on_load_binary/1, - on_load_embedded/1, on_load_errors/1, big_boot_embedded/1, + on_load_embedded/1, on_load_errors/1, on_load_update/1, + on_load_purge/1, on_load_self_call/1, on_load_pending/1, + big_boot_embedded/1, native_early_modules/1, get_mode/1, normalized_paths/1]). @@ -61,7 +64,8 @@ all() -> ext_mod_dep, clash, where_is_file, purge_stacktrace, mult_lib_roots, bad_erl_libs, code_archive, code_archive2, on_load, - on_load_binary, on_load_embedded, on_load_errors, + on_load_binary, on_load_embedded, on_load_errors, on_load_update, + on_load_purge, on_load_self_call, on_load_pending, big_boot_embedded, native_early_modules, get_mode, normalized_paths]. groups() -> @@ -826,6 +830,12 @@ check_funs({'$M_EXPR',warning_msg,2}, [{code_server,finish_on_load_report,2} | _]) -> 0; check_funs({'$M_EXPR','$F_EXPR',1}, [{code_server,run,2}|_]) -> 0; +check_funs({'$M_EXPR','$F_EXPR',2}, + [{code_server,handle_on_load,5}|_]) -> 0; +check_funs({'$M_EXPR','$F_EXPR',2}, + [{code_server,handle_pending_on_load,4}|_]) -> 0; +check_funs({'$M_EXPR','$F_EXPR',2}, + [{code_server,finish_on_load_2,3}|_]) -> 0; %% This is cheating! /raimo %% %% check_funs(This = {M,_,_}, Path) -> @@ -1184,22 +1194,17 @@ on_load_binary(_) -> register(Master, self()), %% Construct, compile and pretty-print. - Mod = on_load_binary, + Mod = ?FUNCTION_NAME, File = atom_to_list(Mod) ++ ".erl", - Forms = [{attribute,1,file,{File,1}}, - {attribute,1,module,Mod}, - {attribute,2,export,[{ok,0}]}, - {attribute,3,on_load,{init,0}}, - {function,5,init,0, - [{clause,5,[],[], - [{op,6,'!', - {atom,6,Master}, - {tuple,6,[{atom,6,Mod},{call,6,{atom,6,self},[]}]}}, - {'receive',7,[{clause,8,[{atom,8,go}],[],[{atom,8,ok}]}]}]}]}, - {function,11,ok,0,[{clause,11,[],[],[{atom,11,true}]}]}], - Forms1 = erl_parse:new_anno(Forms), - {ok,Mod,Bin} = compile:forms(Forms1, [report]), - [io:put_chars(erl_pp:form(F)) || F <- Forms1], + Tree = ?Q(["-module('@Mod@').\n", + "-export([ok/0]).\n", + "-on_load({init,0}).\n", + "init() ->\n", + " '@Master@' ! {on_load_binary,self()},\n", + " receive go -> ok end.\n", + "ok() -> true.\n"]), + {ok,Mod,Bin} = merl:compile(Tree), + merl:print(Tree), {Pid1,Ref1} = spawn_monitor(fun() -> code:load_binary(Mod, File, Bin), @@ -1441,6 +1446,163 @@ do_on_load_error(ReturnValue) -> {undef,[{on_load_error,main,[],_}|_]} = Exit end. +on_load_update(_Config) -> + {Mod,Code1} = on_load_update_code(1), + {module,Mod} = code:load_binary(Mod, "", Code1), + 42 = Mod:a(), + 100 = Mod:b(99), + 4 = erlang:trace_pattern({Mod,'_','_'}, true), + + {Mod,Code2} = on_load_update_code(2), + {error,on_load_failure} = code:load_binary(Mod, "", Code2), + 42 = Mod:a(), + 100 = Mod:b(99), + {'EXIT',{undef,_}} = (catch Mod:never()), + 4 = erlang:trace_pattern({Mod,'_','_'}, false), + + {Mod,Code3} = on_load_update_code(3), + {module,Mod} = code:load_binary(Mod, "", Code3), + 100 = Mod:c(), + {'EXIT',{undef,_}} = (catch Mod:a()), + {'EXIT',{undef,_}} = (catch Mod:b(10)), + {'EXIT',{undef,_}} = (catch Mod:never()), + + ok. + +on_load_update_code(Version) -> + Mod = ?FUNCTION_NAME, + Tree = on_load_update_code_1(Version, Mod), + io:format("Version ~p", [Version]), + {ok,Mod,Code} = merl:compile(Tree), + merl:print(Tree), + io:nl(), + {Mod,Code}. + +on_load_update_code_1(1, Mod) -> + ?Q(["-module('@Mod@').\n", + "-export([a/0,b/1]).\n" + "-on_load(f/0).\n", + "f() -> ok.\n", + "a() -> 42.\n" + "b(I) -> I+1.\n"]); +on_load_update_code_1(2, Mod) -> + ?Q(["-module('@Mod@').\n", + "-export([never/0]).\n" + "-on_load(f/0).\n", + "f() -> 42 = '@Mod@':a(), 1 = '@Mod@':b(0), fail.\n", + "never() -> never.\n"]); +on_load_update_code_1(3, Mod) -> + ?Q(["-module('@Mod@').\n", + "-export([c/0]).\n" + "-on_load(f/0).\n", + "f() -> ok.\n", + "c() -> 100.\n"]). + +on_load_purge(_Config) -> + Mod = ?FUNCTION_NAME, + register(Mod, self()), + Tree = ?Q(["-module('@Mod@').\n", + "-on_load(f/0).\n", + "loop() -> loop().\n", + "f() ->\n", + "'@Mod@' ! {self(),spawn(fun loop/0)},\n", + "receive Ack -> Ack end.\n"]), + merl:print(Tree), + {ok,Mod,Code} = merl:compile(Tree), + P = spawn(fun() -> + exit(code:load_binary(Mod, "", Code)) + end), + monitor(process, P), + receive + {Pid1,Pid2} -> + monitor(process, Pid2), + Pid1 ! ack_and_failure, + receive + {'DOWN',_,process,P,Exit1} -> + {error,on_load_failure} = Exit1 + end, + receive + {'DOWN',_,process,Pid2,Exit2} -> + io:format("~p\n", [Exit2]) + after 10000 -> + ct:fail(no_down_message) + end + end. + +on_load_self_call(_Config) -> + Mod = ?FUNCTION_NAME, + register(Mod, self()), + Tree = ?Q(["-module('@Mod@').\n", + "-export([ext/0]).\n", + "-on_load(f/0).\n", + "f() ->\n", + " '@Mod@' ! (catch '@Mod@':ext()),\n", + " ok.\n", + "ext() -> good_work.\n"]), + merl:print(Tree), + {ok,Mod,Code} = merl:compile(Tree), + + {'EXIT',{undef,_}} = on_load_do_load(Mod, Code), + good_work = on_load_do_load(Mod, Code), + + ok. + +on_load_do_load(Mod, Code) -> + spawn(fun() -> + {module,Mod} = code:load_binary(Mod, "", Code) + end), + receive + Any -> Any + end. + +on_load_pending(_Config) -> + Mod = ?FUNCTION_NAME, + Tree1 = ?Q(["-module('@Mod@').\n", + "-on_load(f/0).\n", + "f() ->\n", + " register('@Mod@', self()),\n", + " receive _ -> ok end.\n"]), + merl:print(Tree1), + {ok,Mod,Code1} = merl:compile(Tree1), + + Tree2 = ?Q(["-module('@Mod@').\n", + "-export([t/0]).\n", + "t() -> ok.\n"]), + merl:print(Tree2), + {ok,Mod,Code2} = merl:compile(Tree2), + + Self = self(), + {_,Ref1} = + spawn_monitor(fun() -> + Self ! started1, + {module,Mod} = code:load_binary(Mod, "", Code1) + end), + receive started1 -> ok end, + timer:sleep(10), + {_,Ref2} = + spawn_monitor(fun() -> + Self ! started2, + {module,Mod} = code:load_binary(Mod, "", Code2), + ok = Mod:t() + end), + receive started2 -> ok end, + receive + Unexpected -> + ct:fail({unexpected,Unexpected}) + after 100 -> + ok + end, + Mod ! go, + receive + {'DOWN',Ref1,process,_,normal} -> ok + end, + receive + {'DOWN',Ref2,process,_,normal} -> ok + end, + ok = Mod:t(), + ok. + + %% Test that the native code of early loaded modules is loaded. native_early_modules(Config) when is_list(Config) -> case erlang:system_info(hipe_architecture) of diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index bf1548591a..eb58e92224 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -634,7 +634,7 @@ monitor_nodes_nodedown_reason(Config) when is_list(Config) -> stop_node(N4), true = net_kernel:disconnect(N2), TickTime = net_kernel:get_net_ticktime(), - SleepTime = TickTime + (TickTime div 4), + SleepTime = TickTime + (TickTime div 2), spawn(N3, fun () -> block_emu(SleepTime*1000), halt() @@ -911,15 +911,14 @@ monitor_nodes_otp_6481_test(Config, TestType) when is_list(Config) -> %% Verify that '{nodeup, Node}' comes before '{NodeMsg, 1}' (the message %% bringing up the connection). - no_msgs(500), {nodeup, Node} = receive Msg1 -> Msg1 end, - {NodeMsg, 1} = receive Msg2 -> Msg2 end, + {NodeMsg, N} = receive Msg2 -> Msg2 end, %% msg stream has begun, kill the node RemotePid ! {self(), kill_it}, %% Verify that '{nodedown, Node}' comes after the last '{NodeMsg, N}' %% message. - {nodedown, Node} = flush_node_msgs(NodeMsg, 2), + {nodedown, Node} = flush_node_msgs(NodeMsg, N+1), no_msgs(500), Mon = erlang:monitor(process, MN), @@ -932,8 +931,10 @@ monitor_nodes_otp_6481_test(Config, TestType) when is_list(Config) -> flush_node_msgs(NodeMsg, No) -> case receive Msg -> Msg end of - {NodeMsg, No} -> flush_node_msgs(NodeMsg, No+1); - OtherMsg -> OtherMsg + {NodeMsg, N} when N >= No -> + flush_node_msgs(NodeMsg, N+1); + OtherMsg -> + OtherMsg end. node_loop_send(Pid, Msg, No) -> diff --git a/lib/observer/src/observer_alloc_wx.erl b/lib/observer/src/observer_alloc_wx.erl index 220276ac0c..77609b11ce 100644 --- a/lib/observer/src/observer_alloc_wx.erl +++ b/lib/observer/src/observer_alloc_wx.erl @@ -53,25 +53,29 @@ start_link(Notebook, Parent) -> init([Notebook, Parent]) -> try - Panel = wxPanel:new(Notebook), + TopP = wxPanel:new(Notebook), Main = wxBoxSizer:new(?wxVERTICAL), + Panel = wxPanel:new(TopP), + GSzr = wxBoxSizer:new(?wxVERTICAL), BorderFlags = ?wxLEFT bor ?wxRIGHT, - Carrier = make_win(alloc, Panel, Main, BorderFlags bor ?wxTOP), - Utilz = make_win(utilz, Panel, Main, BorderFlags), - - MemWin = {MemPanel,_} = create_mem_info(Panel), - wxSizer:add(Main, MemPanel, [{flag, ?wxEXPAND bor BorderFlags bor ?wxBOTTOM}, - {proportion, 1}, {border, 5}]), - wxWindow:setSizer(Panel, Main), + Carrier = make_win(alloc, Panel, GSzr, BorderFlags bor ?wxTOP), + Utilz = make_win(utilz, Panel, GSzr, BorderFlags), + wxWindow:setSizer(Panel, GSzr), + wxSizer:add(Main, Panel, [{flag, ?wxEXPAND},{proportion,2}]), + + MemWin = create_mem_info(TopP), + wxSizer:add(Main, MemWin, [{flag, ?wxEXPAND bor BorderFlags bor ?wxBOTTOM}, + {proportion, 1}, {border, 5}]), + wxWindow:setSizer(TopP, Main), Windows = [Carrier, Utilz], PaintInfo = setup_graph_drawing(Windows), - {Panel, #state{parent= Parent, - panel = Panel, - wins = Windows, - mem = MemWin, - paint = PaintInfo, - time = setup_time() - } + {TopP, #state{parent= Parent, + panel = Panel, + wins = Windows, + mem = MemWin, + paint = PaintInfo, + time = setup_time() + } } catch _:Err -> io:format("~p crashed ~p: ~p~n",[?MODULE, Err, erlang:get_stacktrace()]), @@ -84,12 +88,14 @@ setup_time() -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% handle_event(#wx{id=?ID_REFRESH_INTERVAL, event=#wxCommand{type=command_menu_selected}}, - #state{panel=Panel, appmon=Old, wins=Wins0, time=#ti{fetch=F0} = Ti0} = State) -> + #state{active=Active, panel=Panel, appmon=Old, wins=Wins0, time=#ti{fetch=F0} = Ti0} = State) -> case interval_dialog(Panel, Ti0) of Ti0 -> {noreply, State}; #ti{fetch=F0} = Ti -> %% Same fetch interval force refresh Wins = [W#win{max=undefined} || W <- Wins0], {noreply, precalc(State#state{time=Ti, wins=Wins})}; + Ti when not Active -> + {noreply, State#state{time=Ti}}; Ti -> %% Changed fetch interval, drop all data {noreply, restart_fetcher(Old, State#state{time=Ti})} end; @@ -120,7 +126,7 @@ handle_info({Key, {promise_reply, {badrpc, _}}}, #state{async=Key} = State) -> {noreply, State#state{active=false, appmon=undefined}}; handle_info({Key, {promise_reply, SysInfo}}, - #state{async=Key, panel=Panel, samples=Data, active=Active, wins=Wins0, + #state{async=Key, panel=_Panel, samples=Data, active=Active, wins=Wins0, time=#ti{tick=Tick, disp=Disp0}=Ti} = S0) -> Disp = trunc(Disp0), Next = max(Tick - Disp, 0), @@ -131,7 +137,6 @@ handle_info({Key, {promise_reply, SysInfo}}, if Active -> update_alloc(S0, Info), State = precalc(S1), - catch wxWindow:refresh(Panel), {noreply, State}; true -> {noreply, S1} @@ -193,7 +198,8 @@ precalc(#state{samples=Data0, paint=Paint, time=Ti, wins=Wins0}=State) -> State#state{wins=Wins}. -update_alloc(#state{mem={_, Grid}}, Fields) -> +update_alloc(#state{mem=Grid}, Fields) -> + wxWindow:freeze(Grid), Max = wxListCtrl:getItemCount(Grid), Update = fun({Name, BS, CS}, Row) -> (Row >= Max) andalso wxListCtrl:insertItem(Grid, Row, ""), @@ -203,6 +209,7 @@ update_alloc(#state{mem={_, Grid}}, Fields) -> Row + 1 end, wx:foldl(Update, 0, Fields), + wxWindow:thaw(Grid), Fields. alloc_info(SysInfo) -> @@ -249,9 +256,9 @@ sum_alloc_one_instance([],BS,CS,TotalBS,TotalCS) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% create_mem_info(Parent) -> - Panel = wxPanel:new(Parent), Style = ?wxLC_REPORT bor ?wxLC_SINGLE_SEL bor ?wxLC_HRULES bor ?wxLC_VRULES, - Grid = wxListCtrl:new(Panel, [{style, Style}]), + Grid = wxListCtrl:new(Parent, [{style, Style}]), + Li = wxListItem:new(), AddListEntry = fun({Name, Align, DefSize}, Col) -> wxListItem:setText(Li, Name), @@ -266,12 +273,7 @@ create_mem_info(Parent) -> lists:foldl(AddListEntry, 0, ListItems), wxListItem:destroy(Li), - Sizer = wxBoxSizer:new(?wxVERTICAL), - wxSizer:add(Sizer, Grid, [{flag, ?wxEXPAND bor ?wxLEFT bor ?wxRIGHT}, - {border, 5}, {proportion, 1}]), - wxWindow:setSizerAndFit(Panel, Sizer), - {Panel, Grid}. - + Grid. create_menus(Parent, _) -> View = {"View", [#create_menu{id = ?ID_REFRESH_INTERVAL, text = "Graph Settings"}]}, diff --git a/lib/observer/src/observer_app_wx.erl b/lib/observer/src/observer_app_wx.erl index 0e01429aa7..cef83037d0 100644 --- a/lib/observer/src/observer_app_wx.erl +++ b/lib/observer/src/observer_app_wx.erl @@ -302,7 +302,9 @@ handle_info({delivery, _Pid, app, _Curr, {[], [], [], []}}, handle_info({delivery, Pid, app, Curr, AppData}, State = #state{panel=Panel, appmon=Pid, current=Curr, usegc=UseGC, app_w=AppWin, paint=#paint{font=Font}}) -> - GC = make_gc(AppWin, UseGC), + GC = if UseGC -> {?wxGC:create(AppWin), false}; + true -> {false, wxWindowDC:new(AppWin)} + end, setFont(GC, Font, {0,0,0}), App = build_tree(AppData, GC), destroy_gc(GC), diff --git a/lib/observer/src/observer_lib.erl b/lib/observer/src/observer_lib.erl index 5d5ac37ce9..c6a1c73c83 100644 --- a/lib/observer/src/observer_lib.erl +++ b/lib/observer/src/observer_lib.erl @@ -432,12 +432,12 @@ create_box(Panel, {scroll_boxes,Data}) -> {OuterBox, Boxes}; create_box(Parent, Data) -> - {Title, Align, Info} = get_box_info(Data), + {Title, _Align, Info} = get_box_info(Data), Top = wxStaticBoxSizer:new(?wxVERTICAL, Parent, [{label, Title}]), Panel = wxPanel:new(Parent), Box = wxBoxSizer:new(?wxVERTICAL), - LeftSize = get_max_width(Panel,Info), - RightProportion = [{flag, Align bor ?wxEXPAND}], + LeftSize = 30 + get_max_width(Panel,Info), + RightProportion = [{flag, ?wxEXPAND}], AddRow = fun({Desc0, Value0}) -> Desc = Desc0++":", Line = wxBoxSizer:new(?wxHORIZONTAL), diff --git a/lib/observer/src/observer_perf_wx.erl b/lib/observer/src/observer_perf_wx.erl index 45af08026a..1010a6af4c 100644 --- a/lib/observer/src/observer_perf_wx.erl +++ b/lib/observer/src/observer_perf_wx.erl @@ -142,6 +142,8 @@ handle_event(#wx{id=?ID_REFRESH_INTERVAL, event=#wxCommand{type=command_menu_sel #ti{fetch=F0} = Ti -> %% Same fetch interval force refresh Wins = [W#win{max=undefined} || W <- Wins0], {noreply, precalc(State#state{time=Ti, wins=Wins})}; + Ti when Old =:= undefined -> + {noreply, State#state{time=Ti}}; Ti -> %% Changed fetch interval, drop all data {noreply, restart_fetcher(node(Old), State#state{time=Ti})} end; @@ -762,7 +764,10 @@ make_gc(Panel,UseGC) -> destroy_gc({GC, DC}) -> (GC =/= false) andalso ?wxGC:destroy(GC), - wxPaintDC:destroy(DC). + case DC =/= false andalso wx:getObjectType(DC) of + false -> ok; + Type -> Type:destroy(DC) + end. haveGC() -> try diff --git a/lib/observer/test/crashdump_viewer_SUITE.erl b/lib/observer/test/crashdump_viewer_SUITE.erl index a795c4fe25..73ed890802 100644 --- a/lib/observer/test/crashdump_viewer_SUITE.erl +++ b/lib/observer/test/crashdump_viewer_SUITE.erl @@ -101,7 +101,7 @@ end_per_group(_GroupName, Config) -> init_per_suite(Config) when is_list(Config) -> delete_saved(Config), DataDir = ?config(data_dir,Config), - Rels = [R || R <- [r16b,'17'], ?t:is_release_available(R)] ++ [current], + Rels = [R || R <- ['17','18'], ?t:is_release_available(R)] ++ [current], io:format("Creating crash dumps for the following releases: ~p", [Rels]), AllDumps = create_dumps(DataDir,Rels), [{dumps,AllDumps}|Config]. @@ -606,21 +606,21 @@ dos_dump(DataDir,Rel,Dump) -> rel_opt(Rel) -> case Rel of - r16b -> [{erl,[{release,"r16b_latest"}]}]; '17' -> [{erl,[{release,"17_latest"}]}]; + '18' -> [{erl,[{release,"18_latest"}]}]; current -> [] end. dump_prefix(Rel) -> case Rel of - r16b -> "r16b_dump."; '17' -> "r17_dump."; - current -> "r18_dump." + '18' -> "r18_dump."; + current -> "r19_dump." end. compat_rel(Rel) -> case Rel of - r16b -> "+R16 "; '17' -> "+R17 "; + '18' -> "+R18 "; current -> "" end. diff --git a/lib/runtime_tools/src/runtime_tools.app.src b/lib/runtime_tools/src/runtime_tools.app.src index 4d96996ce0..690c61a4c3 100644 --- a/lib/runtime_tools/src/runtime_tools.app.src +++ b/lib/runtime_tools/src/runtime_tools.app.src @@ -28,7 +28,7 @@ {applications, [kernel, stdlib]}, {env, []}, {mod, {runtime_tools, []}}, - {runtime_dependencies, ["stdlib-2.0","mnesia-4.12","kernel-3.0", - "erts-7.0"]}]}. + {runtime_dependencies, ["stdlib-3.0","mnesia-4.12","kernel-5.0", + "erts-8.0"]}]}. diff --git a/lib/runtime_tools/test/dbg_SUITE.erl b/lib/runtime_tools/test/dbg_SUITE.erl index 6b6e35fc31..0777503ef7 100644 --- a/lib/runtime_tools/test/dbg_SUITE.erl +++ b/lib/runtime_tools/test/dbg_SUITE.erl @@ -167,8 +167,8 @@ distributed(Config) when is_list(Config) -> {value, {matched, Node, 1}} = lists:keysearch(Node, 2, Z), dbg:cn(Node), dbg:tp(dbg,ln,[]), - ok = rpc:call(Node, dbg, ltp, []), - ok = rpc:call(Node, dbg, ln, []), + ok = rpc:block_call(Node, dbg, ltp, []), + ok = rpc:block_call(Node, dbg, ln, []), ok = dbg:ln(), S = self(), {TraceSend, TraceCall} = diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 0327a72c12..946adcf384 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -1520,7 +1520,7 @@ handle_connection_msg(Msg, StateName, State0 = event_queue = Qev0}) -> Renegotiation = renegotiation(StateName), Role = role(StateName), - try ssh_connection:handle_msg(Msg, Connection0, Role) of + try ssh_connection:handle_msg(Msg, Connection0, Role) of {{replies, Replies}, Connection} -> case StateName of {connected,_} -> @@ -1539,14 +1539,14 @@ handle_connection_msg(Msg, StateName, State0 = {keep_state, State0#data{connection_state = Connection}}; {disconnect, Reason0, {{replies, Replies}, Connection}} -> - {Repls,State} = send_replies(Replies, State0#data{connection_state = Connection}), - case {Reason0,Role} of - {{_, Reason}, client} when ((StateName =/= {connected,client}) and (not Renegotiation)) -> - User ! {self(), not_connected, Reason}; - _ -> - ok - end, - {stop, {shutdown,normal}, Repls, State#data{connection_state = Connection}} + {Repls,State} = send_replies(Replies, State0#data{connection_state = Connection}), + case {Reason0,Role} of + {{_, Reason}, client} when ((StateName =/= {connected,client}) and (not Renegotiation)) -> + User ! {self(), not_connected, Reason}; + _ -> + ok + end, + {stop_and_reply, {shutdown,normal}, Repls, State#data{connection_state = Connection}} catch _:Error -> @@ -1556,7 +1556,7 @@ handle_connection_msg(Msg, StateName, State0 = description = "Internal error"}, Connection0, Role), {Repls,State} = send_replies(Replies, State0#data{connection_state = Connection}), - {stop, {shutdown,Error}, Repls, State#data{connection_state = Connection}} + {stop_and_reply, {shutdown,Error}, Repls, State#data{connection_state = Connection}} end. diff --git a/lib/ssh/test/ssh_benchmark_SUITE.erl b/lib/ssh/test/ssh_benchmark_SUITE.erl index 1f11fee350..d9be1a32b7 100644 --- a/lib/ssh/test/ssh_benchmark_SUITE.erl +++ b/lib/ssh/test/ssh_benchmark_SUITE.erl @@ -334,16 +334,16 @@ find_time(accept_to_hello, L) -> C#call.t_call end, ?LINE, - fun(C=#call{mfa = {ssh_connection_handler,handle_event,5}, - args = [_, {version_exchange,_}, _, {hello,_}, _]}) -> + fun(C=#call{mfa = {ssh_connection_handler,handle_event,4}, + args = [_, {version_exchange,_}, {hello,_}, _]}) -> C#call.t_call end, ?LINE ], L, []), {accept_to_hello, now2micro_sec(now_diff(T1,T0)), microsec}; find_time(kex, L) -> - [T0,T1] = find([fun(C=#call{mfa = {ssh_connection_handler,handle_event,5}, - args = [_, {version_exchange,_}, _, {hello,_}, _]}) -> + [T0,T1] = find([fun(C=#call{mfa = {ssh_connection_handler,handle_event,4}, + args = [_, {version_exchange,_}, {hello,_}, _]}) -> C#call.t_call end, ?LINE, @@ -466,8 +466,8 @@ erlang_trace() -> {ssh_message,decode,1}, {public_key,dh_gex_group,4} % To find dh_gex group size ]], - init_trace({ssh_connection_handler,handle_event,5}, - [{['_', {version_exchange,'_'}, '_', {hello,'_'}, '_'], + init_trace({ssh_connection_handler,handle_event,4}, + [{['_', {version_exchange,'_'}, {hello,'_'}, '_'], [], [return_trace]}]), {ok, TracerPid}. diff --git a/lib/ssh/test/ssh_upgrade_SUITE.erl b/lib/ssh/test/ssh_upgrade_SUITE.erl index 5c7ec17dac..06bef2455e 100644 --- a/lib/ssh/test/ssh_upgrade_SUITE.erl +++ b/lib/ssh/test/ssh_upgrade_SUITE.erl @@ -146,7 +146,8 @@ setup_server_client(#state{config=Config} = State) -> SFTP = ssh_sftpd:subsystem_spec([{root,FtpRootDir},{cwd,FtpRootDir}]), - {Server,Host,Port} = ssh_test_lib:daemon([{system_dir,DataDir}, + {Server,Host,Port} = ssh_test_lib:daemon(ssh_test_lib:inet_port(), % when lower rel is 18.x + [{system_dir,DataDir}, {user_passwords,[{"hej","hopp"}]}, {subsystems,[SFTP]}]), diff --git a/lib/ssl/doc/src/notes.xml b/lib/ssl/doc/src/notes.xml index 00419b63db..e9b523d9e1 100644 --- a/lib/ssl/doc/src/notes.xml +++ b/lib/ssl/doc/src/notes.xml @@ -28,6 +28,23 @@ <p>This document describes the changes made to the SSL application.</p> +<section><title>SSL 7.3.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Correct cipher suites conversion and gaurd expression. + Caused problems with GCM cipher suites and client side + option to set signature_algorithms extention values.</p> + <p> + Own Id: OTP-13525</p> + </item> + </list> + </section> + +</section> + <section><title>SSL 7.3.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/ssl/src/dtls_connection.erl b/lib/ssl/src/dtls_connection.erl index e490de7eeb..82d6faee42 100644 --- a/lib/ssl/src/dtls_connection.erl +++ b/lib/ssl/src/dtls_connection.erl @@ -21,7 +21,7 @@ %% Internal application API --behaviour(gen_fsm). +-behaviour(gen_statem). -include("dtls_connection.hrl"). -include("dtls_handshake.hrl"). @@ -36,37 +36,38 @@ %% Internal application API %% Setup --export([start_fsm/8]). +-export([start_fsm/8, start_link/7, init/1]). %% State transition handling --export([next_record/1, next_state/4%, - %%next_state_connection/2 - ]). +-export([next_record/1, next_event/3]). %% Handshake handling --export([%%renegotiate/1, +-export([%%renegotiate/2, send_handshake/2, send_change_cipher/2]). + %% Alert and close handling --export([send_alert/2, handle_own_alert/4, %%handle_close_alert/3, - handle_normal_shutdown/3 - %%handle_unexpected_message/3, - %%alert_user/5, alert_user/8 +-export([%%send_alert/2, handle_own_alert/4, handle_close_alert/3, + handle_normal_shutdown/3 %%, close/5 + %%alert_user/6, alert_user/9 ]). %% Data handling -export([%%write_application_data/3, - read_application_data/2%%, -%% passive_receive/2, next_record_if_active/1 + read_application_data/2, + %%passive_receive/2, + next_record_if_active/1 %%, + %%handle_common_event/4 ]). -%% Called by tls_connection_sup --export([start_link/7]). +%% gen_statem state functions +-export([init/3, error/3, downgrade/3, %% Initiation and take down states + hello/3, certify/3, cipher/3, abbreviated/3, %% Handshake states + connection/3]). +%% gen_statem callbacks +-export([terminate/3, code_change/4, format_status/2]). -%% gen_fsm callbacks --export([init/1, hello/2, certify/2, cipher/2, - abbreviated/2, connection/2, handle_event/3, - handle_sync_event/4, handle_info/3, terminate/3, code_change/4]). +-define(GEN_STATEM_CB_MODE, state_functions). %%==================================================================== %% Internal application API @@ -141,75 +142,74 @@ send_change_cipher(Msg, #state{connection_states = ConnectionStates0, start_link(Role, Host, Port, Socket, Options, User, CbInfo) -> {ok, proc_lib:spawn_link(?MODULE, init, [[Role, Host, Port, Socket, Options, User, CbInfo]])}. -init([Role, Host, Port, Socket, {SSLOpts0, _} = Options, User, CbInfo]) -> +init([Role, Host, Port, Socket, Options, User, CbInfo]) -> process_flag(trap_exit, true), State0 = initial_state(Role, Host, Port, Socket, Options, User, CbInfo), - Handshake = ssl_handshake:init_handshake_history(), - TimeStamp = erlang:monotonic_time(), - try ssl_config:init(SSLOpts0, Role) of - {ok, Ref, CertDbHandle, FileRefHandle, CacheHandle, CRLDbInfo, OwnCert, Key, DHParams} -> - Session = State0#state.session, - State = State0#state{ - tls_handshake_history = Handshake, - session = Session#session{own_certificate = OwnCert, - time_stamp = TimeStamp}, - file_ref_db = FileRefHandle, - cert_db_ref = Ref, - cert_db = CertDbHandle, - crl_db = CRLDbInfo, - session_cache = CacheHandle, - private_key = Key, - diffie_hellman_params = DHParams}, - gen_fsm:enter_loop(?MODULE, [], hello, State, get_timeout(State)) + try + State = ssl_connection:ssl_config(State0#state.ssl_options, Role, State0), + gen_statem:enter_loop(?MODULE, [], ?GEN_STATEM_CB_MODE, init, State) catch throw:Error -> - gen_fsm:enter_loop(?MODULE, [], error, {Error,State0}, get_timeout(State0)) + gen_statem:enter_loop(?MODULE, [], ?GEN_STATEM_CB_MODE, error, {Error,State0}) end. %%-------------------------------------------------------------------- -%% Description:There should be one instance of this function for each -%% possible state name. Whenever a gen_fsm receives an event sent -%% using gen_fsm:send_event/2, the instance of this function with the -%% same name as the current state name StateName is called to handle -%% the event. It is also called if a timeout occurs. -%% -hello(start, #state{host = Host, port = Port, role = client, - ssl_options = SslOpts, - session = #session{own_certificate = Cert} = Session0, - session_cache = Cache, session_cache_cb = CacheCb, - transport_cb = Transport, socket = Socket, - connection_states = ConnectionStates0, - renegotiation = {Renegotiation, _}} = State0) -> +%% State functionsconnection/2 +%%-------------------------------------------------------------------- + +init({call, From}, {start, Timeout}, + #state{host = Host, port = Port, role = client, + ssl_options = SslOpts, + session = #session{own_certificate = Cert} = Session0, + transport_cb = Transport, socket = Socket, + connection_states = ConnectionStates0, + renegotiation = {Renegotiation, _}, + session_cache = Cache, + session_cache_cb = CacheCb + } = State0) -> + Timer = ssl_connection:start_or_recv_cancel_timer(Timeout, From), Hello = dtls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts, - Cache, CacheCb, Renegotiation, Cert), + Cache, CacheCb, Renegotiation, Cert), Version = Hello#client_hello.client_version, + HelloVersion = dtls_record:lowest_protocol_version(SslOpts#ssl_options.versions), Handshake0 = ssl_handshake:init_handshake_history(), {BinMsg, ConnectionStates, Handshake} = - encode_handshake(Hello, Version, ConnectionStates0, Handshake0), + encode_handshake(Hello, HelloVersion, ConnectionStates0, Handshake0), Transport:send(Socket, BinMsg), State1 = State0#state{connection_states = ConnectionStates, negotiated_version = Version, %% Requested version session = Session0#session{session_id = Hello#client_hello.session_id}, - tls_handshake_history = Handshake}, + tls_handshake_history = Handshake, + start_or_recv_from = From, + timer = Timer}, {Record, State} = next_record(State1), - next_state(hello, hello, Record, State); - -hello(Hello = #client_hello{client_version = ClientVersion}, - State = #state{connection_states = ConnectionStates0, - port = Port, session = #session{own_certificate = Cert} = Session0, - renegotiation = {Renegotiation, _}, - session_cache = Cache, - session_cache_cb = CacheCb, - ssl_options = SslOpts}) -> + next_event(hello, Record, State); +init(Type, Event, State) -> + ssl_connection:init(Type, Event, State, ?MODULE). + +error({call, From}, {start, _Timeout}, {Error, State}) -> + {stop_and_reply, normal, {reply, From, {error, Error}}, State}; +error({call, From}, Msg, State) -> + handle_call(Msg, From, error, State); +error(_, _, _) -> + {keep_state_and_data, [postpone]}. + +hello(internal, #client_hello{client_version = ClientVersion} = Hello, + #state{connection_states = ConnectionStates0, + port = Port, session = #session{own_certificate = Cert} = Session0, + renegotiation = {Renegotiation, _}, + session_cache = Cache, + session_cache_cb = CacheCb, + ssl_options = SslOpts} = State) -> case dtls_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb, ConnectionStates0, Cert}, Renegotiation) of {Version, {Type, Session}, ConnectionStates, #hello_extensions{ec_point_formats = EcPointFormats, elliptic_curves = EllipticCurves} = ServerHelloExt, HashSign} -> - ssl_connection:hello({common_client_hello, Type, ServerHelloExt, HashSign}, + ssl_connection:hello(internal, {common_client_hello, Type, ServerHelloExt, HashSign}, State#state{connection_states = ConnectionStates, negotiated_version = Version, session = Session, @@ -217,7 +217,7 @@ hello(Hello = #client_hello{client_version = ClientVersion}, #alert{} = Alert -> handle_own_alert(Alert, ClientVersion, hello, State) end; -hello(Hello, +hello(internal, Hello, #state{connection_states = ConnectionStates0, negotiated_version = ReqVersion, role = client, @@ -230,20 +230,30 @@ hello(Hello, ssl_connection:handle_session(Hello, Version, NewId, ConnectionStates, ProtoExt, Protocol, State) end; - -hello(Msg, State) -> - ssl_connection:hello(Msg, State, ?MODULE). - -abbreviated(Msg, State) -> - ssl_connection:abbreviated(Msg, State, ?MODULE). - -certify(Msg, State) -> - ssl_connection:certify(Msg, State, ?MODULE). - -cipher(Msg, State) -> - ssl_connection:cipher(Msg, State, ?MODULE). - -connection(#hello_request{}, #state{host = Host, port = Port, +hello(info, Event, State) -> + handle_info(Event, hello, State); + +hello(Type, Event, State) -> + ssl_connection:hello(Type, Event, State, ?MODULE). + +abbreviated(info, Event, State) -> + handle_info(Event, abbreviated, State); +abbreviated(Type, Event, State) -> + ssl_connection:abbreviated(Type, Event, State, ?MODULE). + +certify(info, Event, State) -> + handle_info(Event, certify, State); +certify(Type, Event, State) -> + ssl_connection:certify(Type, Event, State, ?MODULE). + +cipher(info, Event, State) -> + handle_info(Event, cipher, State); +cipher(Type, Event, State) -> + ssl_connection:cipher(Type, Event, State, ?MODULE). + +connection(info, Event, State) -> + handle_info(Event, connection, State); +connection(internal, #hello_request{}, #state{host = Host, port = Port, session = #session{own_certificate = Cert} = Session0, session_cache = Cache, session_cache_cb = CacheCb, ssl_options = SslOpts, @@ -257,40 +267,30 @@ connection(#hello_request{}, #state{host = Host, port = Port, next_record( State1#state{session = Session0#session{session_id = Hello#client_hello.session_id}}), - next_state(connection, hello, Record, State); + next_event(hello, Record, State); -connection(#client_hello{} = Hello, #state{role = server, allow_renegotiate = true} = State) -> +connection(internal, #client_hello{} = Hello, #state{role = server, allow_renegotiate = true} = State) -> %% Mitigate Computational DoS attack %% http://www.educatedguesswork.org/2011/10/ssltls_and_computational_dos.html %% http://www.thc.org/thc-ssl-dos/ Rather than disabling client %% initiated renegotiation we will disallow many client initiated %% renegotiations immediately after each other. erlang:send_after(?WAIT_TO_ALLOW_RENEGOTIATION, self(), allow_renegotiate), - hello(Hello, State#state{allow_renegotiate = false}); + {next_state, hello, State#state{allow_renegotiate = false}, [{next_event, internal, Hello}]}; + -connection(#client_hello{}, #state{role = server, allow_renegotiate = false} = State0) -> +connection(internal, #client_hello{}, #state{role = server, allow_renegotiate = false} = State0) -> Alert = ?ALERT_REC(?WARNING, ?NO_RENEGOTIATION), - State = send_alert(Alert, State0), - next_state_connection(connection, State); + State1 = send_alert(Alert, State0), + {Record, State} = ssl_connection:prepare_connection(State1, ?MODULE), + next_event(connection, Record, State); -connection(Msg, State) -> - ssl_connection:connection(Msg, State, tls_connection). +connection(Type, Event, State) -> + ssl_connection:connection(Type, Event, State, ?MODULE). -%%-------------------------------------------------------------------- -%% Description: Whenever a gen_fsm receives an event sent using -%% gen_fsm:send_all_state_event/2, this function is called to handle -%% the event. Not currently used! -%%-------------------------------------------------------------------- -handle_event(_Event, StateName, State) -> - {next_state, StateName, State, get_timeout(State)}. +downgrade(Type, Event, State) -> + ssl_connection:downgrade(Type, Event, State, ?MODULE). -%%-------------------------------------------------------------------- -%% Description: Whenever a gen_fsm receives an event sent using -%% gen_fsm:sync_send_all_state_event/2,3, this function is called to handle -%% the event. -%%-------------------------------------------------------------------- -handle_sync_event(Event, From, StateName, State) -> - ssl_connection:handle_sync_event(Event, From, StateName, State). %%-------------------------------------------------------------------- %% Description: This function is called by a gen_fsm when it receives any @@ -301,26 +301,25 @@ handle_sync_event(Event, From, StateName, State) -> %% raw data from socket, unpack records handle_info({Protocol, _, Data}, StateName, #state{data_tag = Protocol} = State0) -> - %% Simplify for now to avoid dialzer warnings before implementation is compleate - %% case next_tls_record(Data, State0) of - %% {Record, State} -> - %% next_state(StateName, StateName, Record, State); - %% #alert{} = Alert -> - %% handle_normal_shutdown(Alert, StateName, State0), - %% {stop, {shutdown, own_alert}, State0} - %% end; - {Record, State} = next_tls_record(Data, State0), - next_state(StateName, StateName, Record, State); - + case next_tls_record(Data, State0) of + {Record, State} -> + next_event(StateName, Record, State); + #alert{} = Alert -> + handle_normal_shutdown(Alert, StateName, State0), + {stop, {shutdown, own_alert}} + end; handle_info({CloseTag, Socket}, StateName, #state{socket = Socket, close_tag = CloseTag, negotiated_version = _Version} = State) -> handle_normal_shutdown(?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), StateName, State), - {stop, {shutdown, transport_closed}, State}; + {stop, {shutdown, transport_closed}}; handle_info(Msg, StateName, State) -> ssl_connection:handle_info(Msg, StateName, State). +handle_call(Event, From, StateName, State) -> + ssl_connection:handle_call(Event, From, StateName, State, ?MODULE). + %%-------------------------------------------------------------------- %% Description:This function is called by a gen_fsm when it is about %% to terminate. It should be the opposite of Module:init/1 and do any @@ -335,7 +334,10 @@ terminate(Reason, StateName, State) -> %% Description: Convert process state when code is changed %%-------------------------------------------------------------------- code_change(_OldVsn, StateName, State, _Extra) -> - {ok, StateName, State}. + {?GEN_STATEM_CB_MODE, StateName, State}. + +format_status(Type, Data) -> + ssl_connection:format_status(Type, Data). %%-------------------------------------------------------------------- %%% Internal functions @@ -372,96 +374,28 @@ next_record(#state{socket = Socket, next_record(State) -> {no_record, State}. -next_state(Current,_, #alert{} = Alert, #state{negotiated_version = Version} = State) -> - handle_own_alert(Alert, Version, Current, State); - -next_state(_,Next, no_record, State) -> - {next_state, Next, State, get_timeout(State)}; - -%% next_state(_,Next, #ssl_tls{type = ?ALERT, fragment = EncAlerts}, State) -> -%% Alerts = decode_alerts(EncAlerts), -%% handle_alerts(Alerts, {next_state, Next, State, get_timeout(State)}); - -next_state(Current, Next, #ssl_tls{type = ?HANDSHAKE, fragment = Data}, - State0 = #state{protocol_buffers = - #protocol_buffers{dtls_handshake_buffer = Buf0} = Buffers, - negotiated_version = Version}) -> - Handle = - fun({#hello_request{} = Packet, _}, {next_state, connection = SName, State}) -> - %% This message should not be included in handshake - %% message hashes. Starts new handshake (renegotiation) - Hs0 = ssl_handshake:init_handshake_history(), - ?MODULE:SName(Packet, State#state{tls_handshake_history=Hs0, - renegotiation = {true, peer}}); - ({#hello_request{} = Packet, _}, {next_state, SName, State}) -> - %% This message should not be included in handshake - %% message hashes. Already in negotiation so it will be ignored! - ?MODULE:SName(Packet, State); - ({#client_hello{} = Packet, Raw}, {next_state, connection = SName, State}) -> - Version = Packet#client_hello.client_version, - Hs0 = ssl_handshake:init_handshake_history(), - Hs1 = ssl_handshake:update_handshake_history(Hs0, Raw), - ?MODULE:SName(Packet, State#state{tls_handshake_history=Hs1, - renegotiation = {true, peer}}); - ({Packet, Raw}, {next_state, SName, State = #state{tls_handshake_history=Hs0}}) -> - Hs1 = ssl_handshake:update_handshake_history(Hs0, Raw), - ?MODULE:SName(Packet, State#state{tls_handshake_history=Hs1}); - (_, StopState) -> StopState - end, - try - {Packets, Buf} = tls_handshake:get_tls_handshake(Version,Data,Buf0), - State = State0#state{protocol_buffers = - Buffers#protocol_buffers{dtls_packets = Packets, - dtls_handshake_buffer = Buf}}, - handle_dtls_handshake(Handle, Next, State) - catch throw:#alert{} = Alert -> - handle_own_alert(Alert, Version, Current, State0) - end; -next_state(_, StateName, #ssl_tls{type = ?APPLICATION_DATA, fragment = Data}, State0) -> - %% Simplify for now to avoid dialzer warnings before implementation is compleate - %% case read_application_data(Data, State0) of - %% Stop = {stop,_,_} -> - %% Stop; - %% {Record, State} -> - %% next_state(StateName, StateName, Record, State) - %% end; - {Record, State} = read_application_data(Data, State0), - next_state(StateName, StateName, Record, State); - -next_state(Current, Next, #ssl_tls{type = ?CHANGE_CIPHER_SPEC, fragment = <<1>>} = - _ChangeCipher, - #state{connection_states = ConnectionStates0} = State0) -> - ConnectionStates1 = - ssl_record:activate_pending_connection_state(ConnectionStates0, read), - {Record, State} = next_record(State0#state{connection_states = ConnectionStates1}), - next_state(Current, Next, Record, State); -next_state(Current, Next, #ssl_tls{type = _Unknown}, State0) -> - %% Ignore unknown type - {Record, State} = next_record(State0), - next_state(Current, Next, Record, State). - -handle_dtls_handshake(Handle, StateName, - #state{protocol_buffers = - #protocol_buffers{dtls_packets = [Packet]} = Buffers} = State) -> - FsmReturn = {next_state, StateName, State#state{protocol_buffers = - Buffers#protocol_buffers{dtls_packets = []}}}, - Handle(Packet, FsmReturn); - -handle_dtls_handshake(Handle, StateName, - #state{protocol_buffers = - #protocol_buffers{dtls_packets = [Packet | Packets]} = Buffers} = - State0) -> - FsmReturn = {next_state, StateName, State0#state{protocol_buffers = - Buffers#protocol_buffers{dtls_packets = - Packets}}}, - case Handle(Packet, FsmReturn) of - {next_state, NextStateName, State, _Timeout} -> - handle_dtls_handshake(Handle, NextStateName, State); - {stop, _,_} = Stop -> - Stop - end. +next_event(StateName, Record, State) -> + next_event(StateName, Record, State, []). +next_event(connection = StateName, no_record, State0, Actions) -> + case next_record_if_active(State0) of + {no_record, State} -> + ssl_connection:hibernate_after(StateName, State, Actions); + {#ssl_tls{} = Record, State} -> + {next_state, StateName, State, [{next_event, internal, {dtls_record, Record}} | Actions]}; + {#alert{} = Alert, State} -> + {next_state, StateName, State, [{next_event, internal, Alert} | Actions]} + end; +next_event(StateName, Record, State, Actions) -> + case Record of + no_record -> + {next_state, StateName, State, Actions}; + #ssl_tls{} = Record -> + {next_state, StateName, State, [{next_event, internal, {dtls_record, Record}} | Actions]}; + #alert{} = Alert -> + {next_state, StateName, State, [{next_event, internal, Alert} | Actions]} + end. send_flight(Fragments, #state{transport_cb = Transport, socket = Socket, protocol_buffers = _PBuffers} = State) -> @@ -514,21 +448,23 @@ initial_state(Role, Host, Port, Socket, {SSLOptions, SocketOptions}, User, renegotiation = {false, first}, allow_renegotiate = SSLOptions#ssl_options.client_renegotiation, start_or_recv_from = undefined, - send_queue = queue:new(), protocol_cb = ?MODULE }. read_application_data(_,State) -> {#ssl_tls{fragment = <<"place holder">>}, State}. - + +next_tls_record(<<>>, _State) -> + #alert{}; %% Place holder next_tls_record(_, State) -> {#ssl_tls{fragment = <<"place holder">>}, State}. -get_timeout(_) -> %% Place holder - infinity. - -next_state_connection(_, State) -> %% Place holder - {next_state, connection, State, get_timeout(State)}. - sequence(_) -> %%TODO real imp 1. +next_record_if_active(State = + #state{socket_options = + #socket_options{active = false}}) -> + {no_record ,State}; + +next_record_if_active(State) -> + next_record(State). diff --git a/lib/ssl/src/dtls_record.erl b/lib/ssl/src/dtls_record.erl index 2530d66052..e79e1cede0 100644 --- a/lib/ssl/src/dtls_record.erl +++ b/lib/ssl/src/dtls_record.erl @@ -39,7 +39,7 @@ -export([encode_plain_text/4, encode_handshake/3, encode_change_cipher_spec/2]). %% Protocol version handling --export([protocol_version/1, lowest_protocol_version/2, +-export([protocol_version/1, lowest_protocol_version/2, lowest_protocol_version/1, highest_protocol_version/1, supported_protocol_versions/0, is_acceptable_version/2]). @@ -254,6 +254,18 @@ lowest_protocol_version(Version = {M,_}, {N, _}) when M > N -> Version; lowest_protocol_version(_,Version) -> Version. + +%%-------------------------------------------------------------------- +-spec lowest_protocol_version([dtls_version()]) -> dtls_version(). +%% +%% Description: Lowest protocol version present in a list +%%-------------------------------------------------------------------- +lowest_protocol_version([]) -> + lowest_protocol_version(); +lowest_protocol_version(Versions) -> + [Ver | Vers] = Versions, + lowest_list_protocol_version(Ver, Vers). + %%-------------------------------------------------------------------- -spec highest_protocol_version([dtls_version()]) -> dtls_version(). %% @@ -302,6 +314,12 @@ supported_protocol_versions([]) -> supported_protocol_versions([_|_] = Vsns) -> Vsns. +%% highest_protocol_version() -> +%% highest_protocol_version(supported_protocol_versions()). + +lowest_protocol_version() -> + lowest_protocol_version(supported_protocol_versions()). + supported_connection_protocol_versions([]) -> ?ALL_DATAGRAM_SUPPORTED_VERSIONS. @@ -421,3 +439,8 @@ mac_hash(Version, MacAlg, MacSecret, SeqNo, Type, Length, Fragment) -> calc_aad(Type, {MajVer, MinVer}, Epoch, SeqNo) -> NewSeq = (Epoch bsl 48) + SeqNo, <<NewSeq:64/integer, ?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer)>>. + +lowest_list_protocol_version(Ver, []) -> + Ver; +lowest_list_protocol_version(Ver1, [Ver2 | Rest]) -> + lowest_list_protocol_version(lowest_protocol_version(Ver1, Ver2), Rest). diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl index 025e8cea61..dbbb25025c 100644 --- a/lib/ssl/src/ssl.erl +++ b/lib/ssl/src/ssl.erl @@ -696,7 +696,7 @@ handle_options(Opts0, Role) -> default_option_role(server, true, Role), server, Role), renegotiate_at = handle_option(renegotiate_at, Opts, ?DEFAULT_RENEGOTIATE_AT), - hibernate_after = handle_option(hibernate_after, Opts, undefined), + hibernate_after = handle_option(hibernate_after, Opts, infinity), erl_dist = handle_option(erl_dist, Opts, false), alpn_advertised_protocols = handle_option(alpn_advertised_protocols, Opts, undefined), @@ -885,10 +885,13 @@ validate_option(client_renegotiation, Value) when is_boolean(Value) -> validate_option(renegotiate_at, Value) when is_integer(Value) -> erlang:min(Value, ?DEFAULT_RENEGOTIATE_AT); -validate_option(hibernate_after, undefined) -> - undefined; +validate_option(hibernate_after, undefined) -> %% Backwards compatibility + infinity; +validate_option(hibernate_after, infinity) -> + infinity; validate_option(hibernate_after, Value) when is_integer(Value), Value >= 0 -> Value; + validate_option(erl_dist,Value) when is_boolean(Value) -> Value; validate_option(Opt, Value) diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl index 0073e86e26..26c371a8ea 100644 --- a/lib/ssl/src/ssl_connection.erl +++ b/lib/ssl/src/ssl_connection.erl @@ -38,7 +38,7 @@ %% Setup -export([connect/8, ssl_accept/7, handshake/2, handshake/3, - socket_control/4, socket_control/5]). + socket_control/4, socket_control/5, start_or_recv_cancel_timer/2]). %% User Events -export([send/2, recv/3, close/2, shutdown/2, @@ -47,12 +47,16 @@ connection_information/1 ]). --export([handle_session/7]). +%% General gen_statem state functions with extra callback argument +%% to determine if it is an SSL/TLS or DTLS gen_statem machine +-export([init/4, hello/4, abbreviated/4, certify/4, cipher/4, connection/4, downgrade/4]). -%% SSL FSM state functions --export([hello/3, abbreviated/3, certify/3, cipher/3, connection/3]). -%% SSL all state functions --export([handle_sync_event/4, handle_info/3, terminate/3, format_status/2]). +%% gen_statem callbacks +-export([terminate/3, format_status/2]). + +%% +-export([handle_info/3, handle_call/5, handle_session/7, ssl_config/3, + prepare_connection/2, hibernate_after/3]). %%==================================================================== @@ -100,7 +104,7 @@ ssl_accept(Connection, Port, Socket, Opts, User, CbInfo, Timeout) -> %% Description: Starts ssl handshake. %%-------------------------------------------------------------------- handshake(#sslsocket{pid = Pid}, Timeout) -> - case sync_send_all_state_event(Pid, {start, Timeout}) of + case call(Pid, {start, Timeout}) of connected -> ok; Error -> @@ -114,7 +118,7 @@ handshake(#sslsocket{pid = Pid}, Timeout) -> %% Description: Starts ssl handshake with some new options %%-------------------------------------------------------------------- handshake(#sslsocket{pid = Pid}, SslOptions, Timeout) -> - case sync_send_all_state_event(Pid, {start, SslOptions, Timeout}) of + case call(Pid, {start, SslOptions, Timeout}) of connected -> ok; Error -> @@ -148,7 +152,7 @@ socket_control(Connection, Socket, Pid, Transport, ListenTracker) -> %% Description: Sends data over the ssl connection %%-------------------------------------------------------------------- send(Pid, Data) -> - sync_send_all_state_event(Pid, {application_data, + call(Pid, {application_data, %% iolist_to_binary should really %% be called iodata_to_binary() erlang:iolist_to_binary(Data)}). @@ -160,7 +164,7 @@ send(Pid, Data) -> %% Description: Receives data when active = false %%-------------------------------------------------------------------- recv(Pid, Length, Timeout) -> - sync_send_all_state_event(Pid, {recv, Length, Timeout}). + call(Pid, {recv, Length, Timeout}). %%-------------------------------------------------------------------- -spec connection_information(pid()) -> {ok, list()} | {error, reason()}. @@ -168,7 +172,7 @@ recv(Pid, Length, Timeout) -> %% Description: Get the SNI hostname %%-------------------------------------------------------------------- connection_information(Pid) when is_pid(Pid) -> - sync_send_all_state_event(Pid, connection_information). + call(Pid, connection_information). %%-------------------------------------------------------------------- -spec close(pid(), {close, Timeout::integer() | @@ -178,7 +182,7 @@ connection_information(Pid) when is_pid(Pid) -> %% Description: Close an ssl connection %%-------------------------------------------------------------------- close(ConnectionPid, How) -> - case sync_send_all_state_event(ConnectionPid, How) of + case call(ConnectionPid, How) of {error, closed} -> ok; Other -> @@ -190,7 +194,7 @@ close(ConnectionPid, How) -> %% Description: Same as gen_tcp:shutdown/2 %%-------------------------------------------------------------------- shutdown(ConnectionPid, How) -> - sync_send_all_state_event(ConnectionPid, {shutdown, How}). + call(ConnectionPid, {shutdown, How}). %%-------------------------------------------------------------------- -spec new_user(pid(), pid()) -> ok | {error, reason()}. @@ -199,7 +203,7 @@ shutdown(ConnectionPid, How) -> %% or once. %%-------------------------------------------------------------------- new_user(ConnectionPid, User) -> - sync_send_all_state_event(ConnectionPid, {new_user, User}). + call(ConnectionPid, {new_user, User}). %%-------------------------------------------------------------------- -spec negotiated_protocol(pid()) -> {ok, binary()} | {error, reason()}. @@ -207,7 +211,7 @@ new_user(ConnectionPid, User) -> %% Description: Returns the negotiated protocol %%-------------------------------------------------------------------- negotiated_protocol(ConnectionPid) -> - sync_send_all_state_event(ConnectionPid, negotiated_protocol). + call(ConnectionPid, negotiated_protocol). %%-------------------------------------------------------------------- -spec get_opts(pid(), list()) -> {ok, list()} | {error, reason()}. @@ -215,14 +219,14 @@ negotiated_protocol(ConnectionPid) -> %% Description: Same as inet:getopts/2 %%-------------------------------------------------------------------- get_opts(ConnectionPid, OptTags) -> - sync_send_all_state_event(ConnectionPid, {get_opts, OptTags}). + call(ConnectionPid, {get_opts, OptTags}). %%-------------------------------------------------------------------- -spec set_opts(pid(), list()) -> ok | {error, reason()}. %% %% Description: Same as inet:setopts/2 %%-------------------------------------------------------------------- set_opts(ConnectionPid, Options) -> - sync_send_all_state_event(ConnectionPid, {set_opts, Options}). + call(ConnectionPid, {set_opts, Options}). %%-------------------------------------------------------------------- -spec session_info(pid()) -> {ok, list()} | {error, reason()}. @@ -230,7 +234,7 @@ set_opts(ConnectionPid, Options) -> %% Description: Returns info about the ssl session %%-------------------------------------------------------------------- session_info(ConnectionPid) -> - sync_send_all_state_event(ConnectionPid, session_info). + call(ConnectionPid, session_info). %%-------------------------------------------------------------------- -spec peer_certificate(pid()) -> {ok, binary()| undefined} | {error, reason()}. @@ -238,7 +242,7 @@ session_info(ConnectionPid) -> %% Description: Returns the peer cert %%-------------------------------------------------------------------- peer_certificate(ConnectionPid) -> - sync_send_all_state_event(ConnectionPid, peer_certificate). + call(ConnectionPid, peer_certificate). %%-------------------------------------------------------------------- -spec renegotiation(pid()) -> ok | {error, reason()}. @@ -246,7 +250,7 @@ peer_certificate(ConnectionPid) -> %% Description: Starts a renegotiation of the ssl session. %%-------------------------------------------------------------------- renegotiation(ConnectionPid) -> - sync_send_all_state_event(ConnectionPid, renegotiate). + call(ConnectionPid, renegotiate). %%-------------------------------------------------------------------- -spec prf(pid(), binary() | 'master_secret', binary(), @@ -256,9 +260,13 @@ renegotiation(ConnectionPid) -> %% Description: use a ssl sessions TLS PRF to generate key material %%-------------------------------------------------------------------- prf(ConnectionPid, Secret, Label, Seed, WantedLength) -> - sync_send_all_state_event(ConnectionPid, {prf, Secret, Label, Seed, WantedLength}). - + call(ConnectionPid, {prf, Secret, Label, Seed, WantedLength}). +%%-------------------------------------------------------------------- +-spec handle_session(#server_hello{}, ssl_record:ssl_version(), + binary(), #connection_states{}, _,_, #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- handle_session(#server_hello{cipher_suite = CipherSuite, compression_method = Compression}, Version, NewId, ConnectionStates, ProtoExt, Protocol0, @@ -290,61 +298,104 @@ handle_session(#server_hello{cipher_suite = CipherSuite, handle_resumed_session(NewId, State#state{connection_states = ConnectionStates}) end. - + %%-------------------------------------------------------------------- --spec hello(start | #hello_request{} | #server_hello{} | term(), - #state{}, tls_connection | dtls_connection) -> - gen_fsm_state_return(). +-spec ssl_config(#ssl_options{}, client | server, #state{}) -> #state{}. %%-------------------------------------------------------------------- -hello(start, #state{role = server} = State0, Connection) -> - {Record, State} = Connection:next_record(State0), - Connection:next_state(hello, hello, Record, State); +ssl_config(Opts, Role, State) -> + {ok, Ref, CertDbHandle, FileRefHandle, CacheHandle, CRLDbInfo, + OwnCert, Key, DHParams} = + ssl_config:init(Opts, Role), + Handshake = ssl_handshake:init_handshake_history(), + TimeStamp = erlang:monotonic_time(), + Session = State#state.session, + State#state{tls_handshake_history = Handshake, + session = Session#session{own_certificate = OwnCert, + time_stamp = TimeStamp}, + file_ref_db = FileRefHandle, + cert_db_ref = Ref, + cert_db = CertDbHandle, + crl_db = CRLDbInfo, + session_cache = CacheHandle, + private_key = Key, + diffie_hellman_params = DHParams, + ssl_options = Opts}. -hello(#hello_request{}, #state{role = client} = State0, Connection) -> - {Record, State} = Connection:next_record(State0), - Connection:next_state(hello, hello, Record, State); +%%==================================================================== +%% gen_statem state functions +%%==================================================================== +%%-------------------------------------------------------------------- +-spec init(gen_statem:event_type(), + {start, timeout()} | {start, {list(), list()}, timeout()}| term(), + #state{}, tls_connection | dtls_connection) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- -hello({common_client_hello, Type, ServerHelloExt}, - State, Connection) -> +init({call, From}, {start, Timeout}, State0, Connection) -> + Timer = start_or_recv_cancel_timer(Timeout, From), + {Record, State} = Connection:next_record(State0#state{start_or_recv_from = From, + timer = Timer}), + Connection:next_event(hello, Record, State); +init({call, From}, {start, {Opts, EmOpts}, Timeout}, + #state{role = Role} = State0, Connection) -> + try + State = ssl_config(Opts, Role, State0), + init({call, From}, {start, Timeout}, + State#state{ssl_options = Opts, socket_options = EmOpts}, Connection) + catch throw:Error -> + {stop_and_reply, normal, {reply, From, {error, Error}}} + end; +init({call, From}, Msg, State, Connection) -> + handle_call(Msg, From, init, State, Connection); +init(_Type, _Event, _State, _Connection) -> + {keep_state_and_data, [postpone]}. + +%%-------------------------------------------------------------------- +-spec hello(gen_statem:event_type(), + #hello_request{} | #server_hello{} | term(), + #state{}, tls_connection | dtls_connection) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +hello({call, From}, Msg, State, Connection) -> + handle_call(Msg, From, hello, State, Connection); +hello(internal, {common_client_hello, Type, ServerHelloExt}, State, Connection) -> do_server_hello(Type, ServerHelloExt, State, Connection); -hello(timeout, State, _) -> - {next_state, hello, State, hibernate}; - -hello(Msg, State, Connection) -> - Connection:handle_unexpected_message(Msg, hello, State). +hello(info, Msg, State, _) -> + handle_info(Msg, hello, State); +hello(Type, Msg, State, Connection) -> + handle_common_event(Type, Msg, hello, State, Connection). %%-------------------------------------------------------------------- --spec abbreviated(#hello_request{} | #finished{} | term(), +-spec abbreviated(gen_statem:event_type(), + #hello_request{} | #finished{} | term(), #state{}, tls_connection | dtls_connection) -> - gen_fsm_state_return(). + gen_statem:state_function_result(). %%-------------------------------------------------------------------- -abbreviated(#hello_request{}, State0, Connection) -> - {Record, State} = Connection:next_record(State0), - Connection:next_state(abbreviated, hello, Record, State); +abbreviated({call, From}, Msg, State, Connection) -> + handle_call(Msg, From, abbreviated, State, Connection); -abbreviated(#finished{verify_data = Data} = Finished, +abbreviated(internal, #finished{verify_data = Data} = Finished, #state{role = server, negotiated_version = Version, expecting_finished = true, tls_handshake_history = Handshake, session = #session{master_secret = MasterSecret}, connection_states = ConnectionStates0} = - State, Connection) -> + State0, Connection) -> case ssl_handshake:verify_connection(Version, Finished, client, get_current_prf(ConnectionStates0, write), MasterSecret, Handshake) of verified -> ConnectionStates = ssl_record:set_client_verify_data(current_both, Data, ConnectionStates0), - Connection:next_state_connection(abbreviated, - ack_connection( - State#state{connection_states = ConnectionStates, - expecting_finished = false})); + {Record, State} = prepare_connection(State0#state{connection_states = ConnectionStates, + expecting_finished = false}, Connection), + Connection:next_event(connection, Record, State); #alert{} = Alert -> - Connection:handle_own_alert(Alert, Version, abbreviated, State) + Connection:handle_own_alert(Alert, Version, abbreviated, State0) end; -abbreviated(#finished{verify_data = Data} = Finished, +abbreviated(internal, #finished{verify_data = Data} = Finished, #state{role = client, tls_handshake_history = Handshake0, session = #session{master_secret = MasterSecret}, negotiated_version = Version, @@ -355,40 +406,49 @@ abbreviated(#finished{verify_data = Data} = Finished, verified -> ConnectionStates1 = ssl_record:set_server_verify_data(current_read, Data, ConnectionStates0), - State = + State1 = finalize_handshake(State0#state{connection_states = ConnectionStates1}, abbreviated, Connection), - Connection:next_state_connection(abbreviated, - ack_connection(State#state{expecting_finished = false})); - #alert{} = Alert -> + {Record, State} = prepare_connection(State1#state{expecting_finished = false}, Connection), + Connection:next_event(connection, Record, State); + #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, abbreviated, State0) end; %% only allowed to send next_protocol message after change cipher spec %% & before finished message and it is not allowed during renegotiation -abbreviated(#next_protocol{selected_protocol = SelectedProtocol}, +abbreviated(internal, #next_protocol{selected_protocol = SelectedProtocol}, #state{role = server, expecting_next_protocol_negotiation = true} = State0, Connection) -> - {Record, State} = Connection:next_record(State0#state{negotiated_protocol = SelectedProtocol}), - Connection:next_state(abbreviated, abbreviated, Record, State#state{expecting_next_protocol_negotiation = false}); - -abbreviated(timeout, State, _) -> - {next_state, abbreviated, State, hibernate }; - -abbreviated(Msg, State, Connection) -> - Connection:handle_unexpected_message(Msg, abbreviated, State). - + {Record, State} = + Connection:next_record(State0#state{negotiated_protocol = SelectedProtocol}), + Connection:next_event(abbreviated, Record, + State#state{expecting_next_protocol_negotiation = false}); +abbreviated(internal, + #change_cipher_spec{type = <<1>>}, #state{connection_states = ConnectionStates0} = + State0, Connection) -> + ConnectionStates1 = + ssl_record:activate_pending_connection_state(ConnectionStates0, read), + {Record, State} = Connection:next_record(State0#state{connection_states = + ConnectionStates1}), + Connection:next_event(abbreviated, Record, State#state{expecting_finished = true}); +abbreviated(info, Msg, State, _) -> + handle_info(Msg, abbreviated, State); +abbreviated(Type, Msg, State, Connection) -> + handle_common_event(Type, Msg, abbreviated, State, Connection). + %%-------------------------------------------------------------------- --spec certify(#hello_request{} | #certificate{} | #server_key_exchange{} | +-spec certify(gen_statem:event_type(), + #hello_request{} | #certificate{} | #server_key_exchange{} | #certificate_request{} | #server_hello_done{} | #client_key_exchange{} | term(), #state{}, tls_connection | dtls_connection) -> - gen_fsm_state_return(). + gen_statem:state_function_result(). %%-------------------------------------------------------------------- -certify(#hello_request{}, State0, Connection) -> - {Record, State} = Connection:next_record(State0), - Connection:next_state(certify, hello, Record, State); - -certify(#certificate{asn1_certificates = []}, +certify({call, From}, Msg, State, Connection) -> + handle_call(Msg, From, certify, State, Connection); +certify(info, Msg, State, _) -> + handle_info(Msg, certify, State); +certify(internal, #certificate{asn1_certificates = []}, #state{role = server, negotiated_version = Version, ssl_options = #ssl_options{verify = verify_peer, fail_if_no_peer_cert = true}} = @@ -396,15 +456,16 @@ certify(#certificate{asn1_certificates = []}, Alert = ?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE), Connection:handle_own_alert(Alert, Version, certify, State); -certify(#certificate{asn1_certificates = []}, +certify(internal, #certificate{asn1_certificates = []}, #state{role = server, ssl_options = #ssl_options{verify = verify_peer, fail_if_no_peer_cert = false}} = State0, Connection) -> - {Record, State} = Connection:next_record(State0#state{client_certificate_requested = false}), - Connection:next_state(certify, certify, Record, State); + {Record, State} = + Connection:next_record(State0#state{client_certificate_requested = false}), + Connection:next_event(certify, Record, State); -certify(#certificate{} = Cert, +certify(internal, #certificate{} = Cert, #state{negotiated_version = Version, role = Role, cert_db = CertDbHandle, @@ -426,7 +487,7 @@ certify(#certificate{} = Cert, Connection:handle_own_alert(Alert, Version, certify, State) end; -certify(#server_key_exchange{exchange_keys = Keys}, +certify(internal, #server_key_exchange{exchange_keys = Keys}, #state{role = client, negotiated_version = Version, key_algorithm = Alg, public_key_info = PubKeyInfo, @@ -438,28 +499,28 @@ certify(#server_key_exchange{exchange_keys = Keys}, Alg == srp_dss; Alg == srp_rsa; Alg == srp_anon -> Params = ssl_handshake:decode_server_key(Keys, Alg, Version), + %% Use negotiated value if TLS-1.2 otherwhise return default HashSign = negotiated_hashsign(Params#server_key_params.hashsign, Alg, PubKeyInfo, Version), + case is_anonymous(Alg) of true -> calculate_secret(Params#server_key_params.params, State#state{hashsign_algorithm = HashSign}, Connection); false -> - case ssl_handshake:verify_server_key(Params, HashSign, ConnectionStates, Version, PubKeyInfo) of + case ssl_handshake:verify_server_key(Params, HashSign, + ConnectionStates, Version, PubKeyInfo) of true -> calculate_secret(Params#server_key_params.params, - State#state{hashsign_algorithm = HashSign}, Connection); + State#state{hashsign_algorithm = HashSign}, + Connection); false -> Connection:handle_own_alert(?ALERT_REC(?FATAL, ?DECRYPT_ERROR), Version, certify, State) end end; -certify(#server_key_exchange{} = Msg, - #state{role = client, key_algorithm = rsa} = State, Connection) -> - Connection:handle_unexpected_message(Msg, certify_server_keyexchange, State); - -certify(#certificate_request{hashsign_algorithms = HashSigns}, +certify(internal, #certificate_request{hashsign_algorithms = HashSigns}, #state{session = #session{own_certificate = Cert}, key_algorithm = KeyExAlg, ssl_options = #ssl_options{signature_algs = SupportedHashSigns}, @@ -470,12 +531,12 @@ certify(#certificate_request{hashsign_algorithms = HashSigns}, Connection:handle_own_alert(Alert, Version, certify, State0); NegotiatedHashSign -> {Record, State} = Connection:next_record(State0#state{client_certificate_requested = true}), - Connection:next_state(certify, certify, Record, + Connection:next_event(certify, Record, State#state{cert_hashsign_algorithm = NegotiatedHashSign}) end; %% PSK and RSA_PSK might bypass the Server-Key-Exchange -certify(#server_hello_done{}, +certify(internal, #server_hello_done{}, #state{session = #session{master_secret = undefined}, negotiated_version = Version, psk_identity = PSKIdentity, @@ -493,10 +554,10 @@ certify(#server_hello_done{}, client_certify_and_key_exchange(State, Connection) end; -certify(#server_hello_done{}, +certify(internal, #server_hello_done{}, #state{session = #session{master_secret = undefined}, ssl_options = #ssl_options{user_lookup_fun = PSKLookup}, - negotiated_version = {Major, Minor}, + negotiated_version = {Major, Minor} = Version, psk_identity = PSKIdentity, premaster_secret = undefined, role = client, @@ -504,16 +565,18 @@ certify(#server_hello_done{}, when Alg == rsa_psk -> Rand = ssl_cipher:random_bytes(?NUM_OF_PREMASTERSECRET_BYTES-2), RSAPremasterSecret = <<?BYTE(Major), ?BYTE(Minor), Rand/binary>>, - case ssl_handshake:premaster_secret({Alg, PSKIdentity}, PSKLookup, RSAPremasterSecret) of + case ssl_handshake:premaster_secret({Alg, PSKIdentity}, PSKLookup, + RSAPremasterSecret) of #alert{} = Alert -> - Alert; + Connection:handle_own_alert(Alert, Version, certify, State0); PremasterSecret -> - State = master_secret(PremasterSecret, State0#state{premaster_secret = RSAPremasterSecret}), + State = master_secret(PremasterSecret, + State0#state{premaster_secret = RSAPremasterSecret}), client_certify_and_key_exchange(State, Connection) end; %% Master secret was determined with help of server-key exchange msg -certify(#server_hello_done{}, +certify(internal, #server_hello_done{}, #state{session = #session{master_secret = MasterSecret} = Session, connection_states = ConnectionStates0, negotiated_version = Version, @@ -529,7 +592,7 @@ certify(#server_hello_done{}, end; %% Master secret is calculated from premaster_secret -certify(#server_hello_done{}, +certify(internal, #server_hello_done{}, #state{session = Session0, connection_states = ConnectionStates0, negotiated_version = Version, @@ -546,14 +609,15 @@ certify(#server_hello_done{}, Connection:handle_own_alert(Alert, Version, certify, State0) end; -certify(#client_key_exchange{} = Msg, +certify(internal = Type, #client_key_exchange{} = Msg, #state{role = server, client_certificate_requested = true, - ssl_options = #ssl_options{fail_if_no_peer_cert = true}} = State, Connection) -> + ssl_options = #ssl_options{fail_if_no_peer_cert = true}} = State, + Connection) -> %% We expect a certificate here - Connection:handle_unexpected_message(Msg, certify_client_key_exchange, State); + handle_common_event(Type, Msg, certify, State, Connection); -certify(#client_key_exchange{exchange_keys = Keys}, +certify(internal, #client_key_exchange{exchange_keys = Keys}, State = #state{key_algorithm = KeyAlg, negotiated_version = Version}, Connection) -> try certify_client_key_exchange(ssl_handshake:decode_client_key(Keys, KeyAlg, Version), @@ -563,22 +627,23 @@ certify(#client_key_exchange{exchange_keys = Keys}, Connection:handle_own_alert(Alert, Version, certify, State) end; -certify(timeout, State, _) -> - {next_state, certify, State, hibernate}; - -certify(Msg, State, Connection) -> - Connection:handle_unexpected_message(Msg, certify, State). - +certify(Type, Msg, State, Connection) -> + handle_common_event(Type, Msg, certify, State, Connection). + %%-------------------------------------------------------------------- --spec cipher(#hello_request{} | #certificate_verify{} | #finished{} | term(), +-spec cipher(gen_statem:event_type(), + #hello_request{} | #certificate_verify{} | #finished{} | term(), #state{}, tls_connection | dtls_connection) -> - gen_fsm_state_return(). + gen_statem:state_function_result(). %%-------------------------------------------------------------------- -cipher(#hello_request{}, State0, Connection) -> - {Record, State} = Connection:next_record(State0), - Connection:next_state(cipher, hello, Record, State); +cipher({call, From}, Msg, State, Connection) -> + handle_call(Msg, From, cipher, State, Connection); -cipher(#certificate_verify{signature = Signature, hashsign_algorithm = CertHashSign}, +cipher(info, Msg, State, _) -> + handle_info(Msg, cipher, State); + +cipher(internal, #certificate_verify{signature = Signature, + hashsign_algorithm = CertHashSign}, #state{role = server, key_algorithm = KexAlg, public_key_info = PublicKeyInfo, @@ -593,19 +658,20 @@ cipher(#certificate_verify{signature = Signature, hashsign_algorithm = CertHashS Version, HashSign, MasterSecret, Handshake) of valid -> {Record, State} = Connection:next_record(State0), - Connection:next_state(cipher, cipher, Record, + Connection:next_event(cipher, Record, State#state{cert_hashsign_algorithm = HashSign}); #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, cipher, State0) end; %% client must send a next protocol message if we are expecting it -cipher(#finished{}, #state{role = server, expecting_next_protocol_negotiation = true, - negotiated_protocol = undefined, negotiated_version = Version} = State0, +cipher(internal, #finished{}, + #state{role = server, expecting_next_protocol_negotiation = true, + negotiated_protocol = undefined, negotiated_version = Version} = State0, Connection) -> Connection:handle_own_alert(?ALERT_REC(?FATAL,?UNEXPECTED_MESSAGE), Version, cipher, State0); -cipher(#finished{verify_data = Data} = Finished, +cipher(internal, #finished{verify_data = Data} = Finished, #state{negotiated_version = Version, host = Host, port = Port, @@ -621,109 +687,154 @@ cipher(#finished{verify_data = Data} = Finished, MasterSecret, Handshake0) of verified -> Session = register_session(Role, Host, Port, Session0), - cipher_role(Role, Data, Session, State#state{expecting_finished = false}, Connection); + cipher_role(Role, Data, Session, + State#state{expecting_finished = false}, Connection); #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, cipher, State) end; %% only allowed to send next_protocol message after change cipher spec %% & before finished message and it is not allowed during renegotiation -cipher(#next_protocol{selected_protocol = SelectedProtocol}, +cipher(internal, #next_protocol{selected_protocol = SelectedProtocol}, #state{role = server, expecting_next_protocol_negotiation = true, expecting_finished = true} = State0, Connection) -> - {Record, State} = Connection:next_record(State0#state{negotiated_protocol = SelectedProtocol}), - Connection:next_state(cipher, cipher, Record, State#state{expecting_next_protocol_negotiation = false}); - -cipher(timeout, State, _) -> - {next_state, cipher, State, hibernate}; - -cipher(Msg, State, Connection) -> - Connection:handle_unexpected_message(Msg, cipher, State). + {Record, State} = + Connection:next_record(State0#state{negotiated_protocol = SelectedProtocol}), + Connection:next_event(cipher, Record, + State#state{expecting_next_protocol_negotiation = false}); +cipher(internal, #change_cipher_spec{type = <<1>>}, #state{connection_states = ConnectionStates0} = + State0, Connection) -> + ConnectionStates1 = + ssl_record:activate_pending_connection_state(ConnectionStates0, read), + {Record, State} = Connection:next_record(State0#state{connection_states = + ConnectionStates1}), + Connection:next_event(cipher, Record, State#state{expecting_finished = true}); +cipher(Type, Msg, State, Connection) -> + handle_common_event(Type, Msg, cipher, State, Connection). %%-------------------------------------------------------------------- --spec connection(term(), #state{}, tls_connection | dtls_connection) -> - gen_fsm_state_return(). +-spec connection(gen_statem:event_type(), term(), + #state{}, tls_connection | dtls_connection) -> + gen_statem:state_function_result(). %%-------------------------------------------------------------------- -connection(timeout, State, _) -> - {next_state, connection, State, hibernate}; +connection({call, From}, {application_data, Data}, + #state{protocol_cb = Connection} = State, Connection) -> + %% We should look into having a worker process to do this to + %% parallize send and receive decoding and not block the receiver + %% if sending is overloading the socket. + try + Connection:write_application_data(Data, From, State) + catch throw:Error -> + hibernate_after(connection, State, [{reply, From, Error}]) + end; +connection({call, RecvFrom}, {recv, N, Timeout}, + #state{protocol_cb = Connection, socket_options = + #socket_options{active = false}} = State0, Connection) -> + Timer = start_or_recv_cancel_timer(Timeout, RecvFrom), + Connection:passive_receive(State0#state{bytes_to_read = N, + start_or_recv_from = RecvFrom, + timer = Timer}, connection); +connection({call, From}, renegotiate, #state{protocol_cb = Connection} = State, + Connection) -> + Connection:renegotiate(State#state{renegotiation = {true, From}}, []); +connection({call, From}, peer_certificate, + #state{session = #session{peer_certificate = Cert}} = State, _) -> + hibernate_after(connection, State, [{reply, From, {ok, Cert}}]); +connection({call, From}, connection_information, State, _) -> + Info = connection_info(State), + hibernate_after(connection, State, [{reply, From, {ok, Info}}]); +connection({call, From}, session_info, #state{session = #session{session_id = Id, + cipher_suite = Suite}} = State, _) -> + SessionInfo = [{session_id, Id}, + {cipher_suite, ssl_cipher:erl_suite_definition(Suite)}], + hibernate_after(connection, State, [{reply, From, SessionInfo}]); +connection({call, From}, negotiated_protocol, + #state{negotiated_protocol = undefined} = State, _) -> + hibernate_after(connection, State, [{reply, From, {error, protocol_not_negotiated}}]); +connection({call, From}, negotiated_protocol, + #state{negotiated_protocol = SelectedProtocol} = State, _) -> + hibernate_after(connection, State, + [{reply, From, {ok, SelectedProtocol}}]); +connection({call, From}, Msg, State, Connection) -> + handle_call(Msg, From, connection, State, Connection); +connection(info, Msg, State, _) -> + handle_info(Msg, connection, State); +connection(internal, {recv, _}, State, Connection) -> + Connection:passive_receive(State, connection); +connection(Type, Msg, State, Connection) -> + handle_common_event(Type, Msg, connection, State, Connection). -connection(Msg, State, Connection) -> - Connection:handle_unexpected_message(Msg, connection, State). +%%-------------------------------------------------------------------- +-spec downgrade(gen_statem:event_type(), term(), + #state{}, tls_connection | dtls_connection) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +downgrade(internal, #alert{description = ?CLOSE_NOTIFY}, + #state{transport_cb = Transport, socket = Socket, + downgrade = {Pid, From}} = State, _) -> + ssl_socket:setopts(Transport, Socket, [{active, false}, {packet, 0}, {mode, binary}]), + Transport:controlling_process(Socket, Pid), + gen_statem:reply(From, {ok, Socket}), + {stop, normal, State}; +downgrade(timeout, downgrade, #state{downgrade = {_, From}} = State, _) -> + gen_statem:reply(From, {error, timeout}), + {stop, normal, State}; +downgrade(Type, Event, State, Connection) -> + handle_common_event(Type, Event, downgrade, State, Connection). %%-------------------------------------------------------------------- -%% Description: Whenever a gen_fsm receives an event sent using -%% gen_fsm:sync_send_all_state_event/2,3, this function is called to handle -%% the event. +%% Event handling functions called by state functions to handle +%% common or unexpected events for the state. %%-------------------------------------------------------------------- -handle_sync_event({application_data, Data}, From, connection, - #state{protocol_cb = Connection} = State) -> - %% We should look into having a worker process to do this to - %% parallize send and receive decoding and not block the receiver - %% if sending is overloading the socket. - try - Connection:write_application_data(Data, From, State) - catch throw:Error -> - {reply, Error, connection, State, get_timeout(State)} +handle_common_event(internal, {tls_record, TLSRecord}, StateName, State, Connection) -> + Connection:handle_common_event(internal, TLSRecord, StateName, State); +handle_common_event(internal, #hello_request{}, StateName, #state{role = client} = State0, Connection) + when StateName =:= connection -> + {Record, State} = Connection:next_record(State0), + Connection:next_event(StateName, Record, State); +handle_common_event(timeout, hibernate, _, _, _) -> + {keep_state_and_data, [hibernate]}; +handle_common_event(internal, {application_data, Data}, StateName, State0, Connection) -> + case Connection:read_application_data(Data, State0) of + {stop, Reason, State} -> + {stop, Reason, State}; + {Record, State} -> + Connection:next_event(StateName, Record, State) end; -handle_sync_event({application_data, Data}, From, StateName, - #state{send_queue = Queue} = State) -> +handle_common_event(internal, #change_cipher_spec{type = <<1>>}, StateName, + #state{negotiated_version = Version} = State, Connection) -> + Connection:handle_own_alert(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE), Version, + StateName, State); +handle_common_event(internal, _, _, _, _) -> + {keep_state_and_data, [postpone]}; +handle_common_event(_Type, Msg, StateName, #state{negotiated_version = Version} = State, + Connection) -> + Alert = ?ALERT_REC(?FATAL,?UNEXPECTED_MESSAGE), + Connection:handle_own_alert(Alert, Version, {StateName, Msg}, State). + +handle_call({application_data, _Data}, _, _, _, _) -> %% In renegotiation priorities handshake, send data when handshake is finished - {next_state, StateName, - State#state{send_queue = queue:in({From, Data}, Queue)}, - get_timeout(State)}; - -handle_sync_event({start, Timeout}, StartFrom, hello, #state{role = Role, - protocol_cb = Connection, - ssl_options = SSLOpts} = State0) -> - try - State = ssl_config(SSLOpts, Role, State0), - Timer = start_or_recv_cancel_timer(Timeout, StartFrom), - Connection:hello(start, State#state{start_or_recv_from = StartFrom, - timer = Timer}) - catch throw:Error -> - {stop, normal, {error, Error}, State0} - end; - -handle_sync_event({start, {Opts, EmOpts}, Timeout}, From, StateName, State) -> - try - handle_sync_event({start, Timeout}, From, StateName, State#state{socket_options = EmOpts, - ssl_options = Opts}) - catch throw:Error -> - {stop, normal, {error, Error}, State} - end; - -%% These two clauses below could happen if a server upgrades a socket in -%% active mode. Note that in this case we are lucky that -%% controlling_process has been evalueated before receiving handshake -%% messages from client. The server should put the socket in passive -%% mode before telling the client that it is willing to upgrade -%% and before calling ssl:ssl_accept/2. These clauses are -%% here to make sure it is the users problem and not owers if -%% they upgrade an active socket. -handle_sync_event({start,_}, _, connection, State) -> - {reply, connected, connection, State, get_timeout(State)}; - -handle_sync_event({start, Timeout}, StartFrom, StateName, #state{role = Role, ssl_options = SslOpts} = State0) -> - try - State = ssl_config(SslOpts, Role, State0), - Timer = start_or_recv_cancel_timer(Timeout, StartFrom), - {next_state, StateName, State#state{start_or_recv_from = StartFrom, - timer = Timer}, get_timeout(State)} - catch throw:Error -> - {stop, normal, {error, Error}, State0} - end; - -handle_sync_event({close, _} = Close, _, StateName, #state{protocol_cb = Connection} = State) -> + {keep_state_and_data, [postpone]}; +handle_call({close, {Pid, Timeout}}, From, StateName, State0, Connection) when is_pid(Pid) -> + %% terminate will send close alert to peer + State = State0#state{downgrade = {Pid, From}}, + Connection:terminate(downgrade, StateName, State), + %% User downgrades connection + %% When downgrading an TLS connection to a transport connection + %% we must recive the close alert from the peer before releasing the + %% transport socket. + {next_state, downgrade, State, [{timeout, Timeout, downgrade}]}; +handle_call({close, _} = Close, From, StateName, State, Connection) -> %% Run terminate before returning so that the reuseaddr - %% inet-option and possible downgrade will work as intended. + %% inet-option Result = Connection:terminate(Close, StateName, State), - {stop, normal, Result, State#state{terminated = true}}; - -handle_sync_event({shutdown, How0}, _, StateName, - #state{transport_cb = Transport, - negotiated_version = Version, - connection_states = ConnectionStates, - socket = Socket} = State) -> + {stop_and_reply, {shutdown, normal}, + {reply, From, Result}, State}; +handle_call({shutdown, How0}, From, _, + #state{transport_cb = Transport, + negotiated_version = Version, + connection_states = ConnectionStates, + socket = Socket}, _) -> case How0 of How when How == write; How == both -> Alert = ?ALERT_REC(?WARNING, ?CLOSE_NOTIFY), @@ -733,95 +844,91 @@ handle_sync_event({shutdown, How0}, _, StateName, _ -> ok end, - + case Transport:shutdown(Socket, How0) of ok -> - {reply, ok, StateName, State, get_timeout(State)}; + {keep_state_and_data, [{reply, From, ok}]}; Error -> - {stop, normal, Error, State} + gen_statem:reply(From, {error, Error}), + {stop, normal} end; -handle_sync_event({recv, _N, _Timeout}, _RecvFrom, StateName, - #state{socket_options = #socket_options{active = Active}} = State) when Active =/= false -> - {reply, {error, einval}, StateName, State, get_timeout(State)}; -handle_sync_event({recv, N, Timeout}, RecvFrom, connection = StateName, - #state{protocol_cb = Connection} = State0) -> - Timer = start_or_recv_cancel_timer(Timeout, RecvFrom), - Connection:passive_receive(State0#state{bytes_to_read = N, - start_or_recv_from = RecvFrom, timer = Timer}, StateName); -%% Doing renegotiate wait with handling request until renegotiate is -%% finished. Will be handled by next_state_is_connection/2. -handle_sync_event({recv, N, Timeout}, RecvFrom, StateName, State) -> +handle_call({recv, _N, _Timeout}, From, _, + #state{socket_options = + #socket_options{active = Active}}, _) when Active =/= false -> + {keep_state_and_data, [{reply, From, {error, einval}}]}; +handle_call({recv, N, Timeout}, RecvFrom, StateName, State, _) -> + %% Doing renegotiate wait with handling request until renegotiate is + %% finished. Timer = start_or_recv_cancel_timer(Timeout, RecvFrom), {next_state, StateName, State#state{bytes_to_read = N, start_or_recv_from = RecvFrom, - timer = Timer}, - get_timeout(State)}; -handle_sync_event({new_user, User}, _From, StateName, - State =#state{user_application = {OldMon, _}}) -> + timer = Timer}, + [{next_event, internal, {recv, RecvFrom}}]}; +handle_call({new_user, User}, From, StateName, + State =#state{user_application = {OldMon, _}}, _) -> NewMon = erlang:monitor(process, User), erlang:demonitor(OldMon, [flush]), - {reply, ok, StateName, State#state{user_application = {NewMon,User}}, - get_timeout(State)}; -handle_sync_event({get_opts, OptTags}, _From, StateName, + {next_state, StateName, State#state{user_application = {NewMon,User}}, + [{reply, From, ok}]}; +handle_call({get_opts, OptTags}, From, _, #state{socket = Socket, transport_cb = Transport, - socket_options = SockOpts} = State) -> + socket_options = SockOpts}, _) -> OptsReply = get_socket_opts(Transport, Socket, OptTags, SockOpts, []), - {reply, OptsReply, StateName, State, get_timeout(State)}; -handle_sync_event(negotiated_protocol, _From, StateName, #state{negotiated_protocol = undefined} = State) -> - {reply, {error, protocol_not_negotiated}, StateName, State, get_timeout(State)}; -handle_sync_event(negotiated_protocol, _From, StateName, #state{negotiated_protocol = SelectedProtocol} = State) -> - {reply, {ok, SelectedProtocol}, StateName, State, get_timeout(State)}; -handle_sync_event({set_opts, Opts0}, _From, StateName0, - #state{socket_options = Opts1, + {keep_state_and_data, [{reply, From, OptsReply}]}; +handle_call({set_opts, Opts0}, From, connection = StateName0, + #state{socket_options = Opts1, protocol_cb = Connection, socket = Socket, transport_cb = Transport, - user_data_buffer = Buffer} = State0) -> + user_data_buffer = Buffer} = State0, _) -> {Reply, Opts} = set_socket_opts(Transport, Socket, Opts0, Opts1, []), State1 = State0#state{socket_options = Opts}, if Opts#socket_options.active =:= false -> - {reply, Reply, StateName0, State1, get_timeout(State1)}; + hibernate_after(StateName0, State1, [{reply, From, Reply}]); Buffer =:= <<>>, Opts1#socket_options.active =:= false -> %% Need data, set active once {Record, State2} = Connection:next_record_if_active(State1), %% Note: Renogotiation may cause StateName0 =/= StateName - case Connection:next_state(StateName0, StateName0, Record, State2) of - {next_state, StateName, State, Timeout} -> - {reply, Reply, StateName, State, Timeout}; + case Connection:next_event(StateName0, Record, State2) of + {next_state, StateName, State} -> + hibernate_after(StateName, State, [{reply, From, Reply}]); + {next_state, StateName, State, Actions} -> + hibernate_after(StateName, State, [{reply, From, Reply} | Actions]); {stop, Reason, State} -> {stop, Reason, State} end; Buffer =:= <<>> -> %% Active once already set - {reply, Reply, StateName0, State1, get_timeout(State1)}; + hibernate_after(StateName0, State1, [{reply, From, Reply}]); true -> case Connection:read_application_data(<<>>, State1) of - Stop = {stop,_,_} -> - Stop; + {stop, Reason, State} -> + {stop, Reason, State}; {Record, State2} -> %% Note: Renogotiation may cause StateName0 =/= StateName - case Connection:next_state(StateName0, StateName0, Record, State2) of - {next_state, StateName, State, Timeout} -> - {reply, Reply, StateName, State, Timeout}; - {stop, Reason, State} -> - {stop, Reason, State} + case Connection:next_event(StateName0, Record, State2) of + {next_state, StateName, State} -> + hibernate_after(StateName, State, [{reply, From, Reply}]); + {next_state, StateName, State, Actions} -> + hibernate_after(StateName, State, [{reply, From, Reply} | Actions]); + {stop, _, _} = Stop -> + Stop end end end; -handle_sync_event(renegotiate, From, connection, #state{protocol_cb = Connection} = State) -> - Connection:renegotiate(State#state{renegotiation = {true, From}}); -handle_sync_event(renegotiate, _, StateName, State) -> - {reply, {error, already_renegotiating}, StateName, State, get_timeout(State)}; -handle_sync_event({prf, Secret, Label, Seed, WantedLength}, _, StateName, - #state{connection_states = ConnectionStates, - negotiated_version = Version} = State) -> +handle_call(renegotiate, From, StateName, _, _) when StateName =/= connection -> + {keep_state_and_data, [{reply, From, {error, already_renegotiating}}]}; +handle_call({prf, Secret, Label, Seed, WantedLength}, From, _, + #state{connection_states = ConnectionStates, + negotiated_version = Version}, _) -> ConnectionState = ssl_record:current_connection_state(ConnectionStates, read), SecParams = ConnectionState#connection_state.security_parameters, #security_parameters{master_secret = MasterSecret, client_random = ClientRandom, - server_random = ServerRandom} = SecParams, + server_random = ServerRandom, + prf_algorithm = PRFAlgorithm} = SecParams, Reply = try SecretToUse = case Secret of _ when is_binary(Secret) -> Secret; @@ -832,32 +939,14 @@ handle_sync_event({prf, Secret, Label, Seed, WantedLength}, _, StateName, (client_random, Acc) -> [ClientRandom|Acc]; (server_random, Acc) -> [ServerRandom|Acc] end, [], Seed)), - ssl_handshake:prf(Version, SecretToUse, Label, SeedToUse, WantedLength) + ssl_handshake:prf(Version, PRFAlgorithm, SecretToUse, Label, SeedToUse, WantedLength) catch exit:_ -> {error, badarg}; error:Reason -> {error, Reason} end, - {reply, Reply, StateName, State, get_timeout(State)}; -handle_sync_event(session_info, _, StateName, - #state{session = #session{session_id = Id, - cipher_suite = Suite}} = State) -> - {reply, [{session_id, Id}, - {cipher_suite, ssl_cipher:erl_suite_definition(Suite)}], - StateName, State, get_timeout(State)}; -handle_sync_event(peer_certificate, _, StateName, - #state{session = #session{peer_certificate = Cert}} - = State) -> - {reply, {ok, Cert}, StateName, State, get_timeout(State)}; -handle_sync_event(connection_information, _, StateName, State) -> - Info = connection_info(State), - {reply, {ok, Info}, StateName, State, get_timeout(State)}. - -connection_info(#state{sni_hostname = SNIHostname, - session = #session{cipher_suite = CipherSuite}, - negotiated_version = Version, ssl_options = Opts}) -> - [{protocol, tls_record:protocol_version(Version)}, - {cipher_suite, ssl_cipher:erl_suite_definition(CipherSuite)}, - {sni_hostname, SNIHostname}] ++ ssl_options_list(Opts). + {keep_state_and_data, [{reply, From, Reply}]}; +handle_call(_,_,_,_,_) -> + {keep_state_and_data, [postpone]}. handle_info({ErrorTag, Socket, econnaborted}, StateName, #state{socket = Socket, transport_cb = Transport, @@ -865,7 +954,8 @@ handle_info({ErrorTag, Socket, econnaborted}, StateName, protocol_cb = Connection, error_tag = ErrorTag, tracker = Tracker} = State) when StateName =/= connection -> - Connection:alert_user(Transport, Tracker,Socket, StartFrom, ?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), Role), + Connection:alert_user(Transport, Tracker,Socket, + StartFrom, ?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), Role), {stop, normal, State}; handle_info({ErrorTag, Socket, Reason}, StateName, #state{socket = Socket, @@ -888,47 +978,46 @@ handle_info({'EXIT', Socket, normal}, _StateName, #state{socket = Socket} = Stat {stop, {shutdown, transport_closed}, State}; handle_info(allow_renegotiate, StateName, State) -> - {next_state, StateName, State#state{allow_renegotiate = true}, get_timeout(State)}; + {next_state, StateName, State#state{allow_renegotiate = true}}; handle_info({cancel_start_or_recv, StartFrom}, StateName, #state{renegotiation = {false, first}} = State) when StateName =/= connection -> - gen_fsm:reply(StartFrom, {error, timeout}), - {stop, {shutdown, user_timeout}, State#state{timer = undefined}}; + {stop_and_reply, {shutdown, user_timeout}, + {reply, StartFrom, {error, timeout}}, State#state{timer = undefined}}; -handle_info({cancel_start_or_recv, RecvFrom}, StateName, #state{start_or_recv_from = RecvFrom} = State) -> - gen_fsm:reply(RecvFrom, {error, timeout}), +handle_info({cancel_start_or_recv, RecvFrom}, StateName, + #state{start_or_recv_from = RecvFrom} = State) when RecvFrom =/= undefined -> {next_state, StateName, State#state{start_or_recv_from = undefined, bytes_to_read = undefined, - timer = undefined}, get_timeout(State)}; + timer = undefined}, [{reply, RecvFrom, {error, timeout}}]}; handle_info({cancel_start_or_recv, _RecvFrom}, StateName, State) -> - {next_state, StateName, State#state{timer = undefined}, get_timeout(State)}; + {next_state, StateName, State#state{timer = undefined}}; handle_info(Msg, StateName, #state{socket = Socket, error_tag = Tag} = State) -> Report = io_lib:format("SSL: Got unexpected info: ~p ~n", [{Msg, Tag, Socket}]), error_logger:info_report(Report), - {next_state, StateName, State, get_timeout(State)}. - + {next_state, StateName, State}. +%%-------------------------------------------------------------------- +%% gen_statem callbacks +%%-------------------------------------------------------------------- terminate(_, _, #state{terminated = true}) -> %% Happens when user closes the connection using ssl:close/1 %% we want to guarantee that Transport:close has been called %% when ssl:close/1 returns. ok; + terminate({shutdown, transport_closed} = Reason, - _StateName, #state{send_queue = SendQueue, protocol_cb = Connection, - socket = Socket, transport_cb = Transport, - renegotiation = Renegotiate} = State) -> + _StateName, #state{protocol_cb = Connection, + socket = Socket, transport_cb = Transport} = State) -> handle_trusted_certs_db(State), - notify_senders(SendQueue), - notify_renegotiater(Renegotiate), Connection:close(Reason, Socket, Transport, undefined, undefined); -terminate({shutdown, own_alert}, _StateName, #state{send_queue = SendQueue, protocol_cb = Connection, - socket = Socket, transport_cb = Transport, - renegotiation = Renegotiate} = State) -> +terminate({shutdown, own_alert}, _StateName, #state{%%send_queue = SendQueue, + protocol_cb = Connection, + socket = Socket, + transport_cb = Transport} = State) -> handle_trusted_certs_db(State), - notify_senders(SendQueue), - notify_renegotiater(Renegotiate), case application:get_env(ssl, alert_timeout) of {ok, Timeout} when is_integer(Timeout) -> Connection:close({timeout, Timeout}, Socket, Transport, undefined, undefined); @@ -939,26 +1028,22 @@ terminate(Reason, connection, #state{negotiated_version = Version, protocol_cb = Connection, connection_states = ConnectionStates0, ssl_options = #ssl_options{padding_check = Check}, - transport_cb = Transport, socket = Socket, - send_queue = SendQueue, renegotiation = Renegotiate} = State) -> + transport_cb = Transport, socket = Socket + } = State) -> handle_trusted_certs_db(State), - notify_senders(SendQueue), - notify_renegotiater(Renegotiate), {BinAlert, ConnectionStates} = terminate_alert(Reason, Version, ConnectionStates0), Transport:send(Socket, BinAlert), Connection:close(Reason, Socket, Transport, ConnectionStates, Check); terminate(Reason, _StateName, #state{transport_cb = Transport, protocol_cb = Connection, - socket = Socket, send_queue = SendQueue, - renegotiation = Renegotiate} = State) -> + socket = Socket + } = State) -> handle_trusted_certs_db(State), - notify_senders(SendQueue), - notify_renegotiater(Renegotiate), Connection:close(Reason, Socket, Transport, undefined, undefined). -format_status(normal, [_, State]) -> - [{data, [{"StateData", State}]}]; -format_status(terminate, [_, State]) -> +format_status(normal, [_, StateName, State]) -> + [{data, [{"State", {StateName, State}}]}]; +format_status(terminate, [_, StateName, State]) -> SslOptions = (State#state.ssl_options), NewOptions = SslOptions#ssl_options{password = ?SECRET_PRINTOUT, cert = ?SECRET_PRINTOUT, @@ -967,39 +1052,29 @@ format_status(terminate, [_, State]) -> dh = ?SECRET_PRINTOUT, psk_identity = ?SECRET_PRINTOUT, srp_identity = ?SECRET_PRINTOUT}, - [{data, [{"StateData", State#state{connection_states = ?SECRET_PRINTOUT, - protocol_buffers = ?SECRET_PRINTOUT, - user_data_buffer = ?SECRET_PRINTOUT, - tls_handshake_history = ?SECRET_PRINTOUT, - session = ?SECRET_PRINTOUT, - private_key = ?SECRET_PRINTOUT, - diffie_hellman_params = ?SECRET_PRINTOUT, - diffie_hellman_keys = ?SECRET_PRINTOUT, - srp_params = ?SECRET_PRINTOUT, - srp_keys = ?SECRET_PRINTOUT, - premaster_secret = ?SECRET_PRINTOUT, - ssl_options = NewOptions - }}]}]. + [{data, [{"State", {StateName, State#state{connection_states = ?SECRET_PRINTOUT, + protocol_buffers = ?SECRET_PRINTOUT, + user_data_buffer = ?SECRET_PRINTOUT, + tls_handshake_history = ?SECRET_PRINTOUT, + session = ?SECRET_PRINTOUT, + private_key = ?SECRET_PRINTOUT, + diffie_hellman_params = ?SECRET_PRINTOUT, + diffie_hellman_keys = ?SECRET_PRINTOUT, + srp_params = ?SECRET_PRINTOUT, + srp_keys = ?SECRET_PRINTOUT, + premaster_secret = ?SECRET_PRINTOUT, + ssl_options = NewOptions} + }}]}]. + %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- -ssl_config(Opts, Role, State) -> - {ok, Ref, CertDbHandle, FileRefHandle, CacheHandle, CRLDbInfo, OwnCert, Key, DHParams} = - ssl_config:init(Opts, Role), - Handshake = ssl_handshake:init_handshake_history(), - TimeStamp = erlang:monotonic_time(), - Session = State#state.session, - State#state{tls_handshake_history = Handshake, - session = Session#session{own_certificate = OwnCert, - time_stamp = TimeStamp}, - file_ref_db = FileRefHandle, - cert_db_ref = Ref, - cert_db = CertDbHandle, - crl_db = CRLDbInfo, - session_cache = CacheHandle, - private_key = Key, - diffie_hellman_params = DHParams, - ssl_options = Opts}. +connection_info(#state{sni_hostname = SNIHostname, + session = #session{cipher_suite = CipherSuite}, + negotiated_version = Version, ssl_options = Opts}) -> + [{protocol, tls_record:protocol_version(Version)}, + {cipher_suite, ssl_cipher:erl_suite_definition(CipherSuite)}, + {sni_hostname, SNIHostname}] ++ ssl_options_list(Opts). do_server_hello(Type, #hello_extensions{next_protocol_negotiation = NextProtocols} = ServerHelloExt, @@ -1033,7 +1108,7 @@ new_server_hello(#server_hello{cipher_suite = CipherSuite, cipher_suite = CipherSuite, compression_method = Compression}, {Record, State} = Connection:next_record(State2#state{session = Session}), - Connection:next_state(hello, certify, Record, State) + Connection:next_event(certify, Record, State) catch #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, hello, State0) @@ -1051,7 +1126,7 @@ resumed_server_hello(#state{session = Session, State2 = finalize_handshake(State1, abbreviated, Connection), {Record, State} = Connection:next_record(State2), - Connection:next_state(hello, abbreviated, Record, State); + Connection:next_event(abbreviated, Record, State); #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, hello, State0) end. @@ -1076,7 +1151,7 @@ handle_peer_cert(Role, PeerCert, PublicKeyInfo, State2 = handle_peer_cert_key(Role, PeerCert, PublicKeyInfo, KeyAlg, State1), {Record, State} = Connection:next_record(State2), - Connection:next_state(certify, certify, Record, State). + Connection:next_event(certify, Record, State). handle_peer_cert_key(client, _, {?'id-ecPublicKey', #'ECPoint'{point = _ECPoint} = PublicKey, @@ -1139,7 +1214,7 @@ client_certify_and_key_exchange(#state{negotiated_version = Version} = %% Reinitialize client_certificate_requested = false}, {Record, State} = Connection:next_record(State3), - Connection:next_state(certify, cipher, Record, State) + Connection:next_event(cipher, Record, State) catch throw:#alert{} = Alert -> Connection:handle_own_alert(Alert, Version, certify, State0) @@ -1173,20 +1248,25 @@ certify_client_key_exchange(#client_ec_diffie_hellman_public{dh_public = ClientP calculate_master_secret(PremasterSecret, State, Connection, certify, cipher); certify_client_key_exchange(#client_psk_identity{} = ClientKey, - #state{ssl_options = #ssl_options{user_lookup_fun = PSKLookup}} = State0, Connection) -> + #state{ssl_options = + #ssl_options{user_lookup_fun = PSKLookup}} = State0, + Connection) -> PremasterSecret = ssl_handshake:premaster_secret(ClientKey, PSKLookup), calculate_master_secret(PremasterSecret, State0, Connection, certify, cipher); certify_client_key_exchange(#client_dhe_psk_identity{} = ClientKey, #state{diffie_hellman_params = #'DHParameter'{} = Params, diffie_hellman_keys = {_, ServerDhPrivateKey}, - ssl_options = #ssl_options{user_lookup_fun = PSKLookup}} = State0, + ssl_options = + #ssl_options{user_lookup_fun = PSKLookup}} = State0, Connection) -> - PremasterSecret = ssl_handshake:premaster_secret(ClientKey, ServerDhPrivateKey, Params, PSKLookup), + PremasterSecret = + ssl_handshake:premaster_secret(ClientKey, ServerDhPrivateKey, Params, PSKLookup), calculate_master_secret(PremasterSecret, State0, Connection, certify, cipher); certify_client_key_exchange(#client_rsa_psk_identity{} = ClientKey, #state{private_key = Key, - ssl_options = #ssl_options{user_lookup_fun = PSKLookup}} = State0, + ssl_options = + #ssl_options{user_lookup_fun = PSKLookup}} = State0, Connection) -> PremasterSecret = ssl_handshake:premaster_secret(ClientKey, Key, PSKLookup), calculate_master_secret(PremasterSecret, State0, Connection, certify, cipher); @@ -1198,8 +1278,11 @@ certify_client_key_exchange(#client_srp_public{} = ClientKey, PremasterSecret = ssl_handshake:premaster_secret(ClientKey, Key, Params), calculate_master_secret(PremasterSecret, State0, Connection, certify, cipher). -certify_server(#state{key_algorithm = Algo} = State, _) - when Algo == dh_anon; Algo == ecdh_anon; Algo == psk; Algo == dhe_psk; Algo == srp_anon -> +certify_server(#state{key_algorithm = Algo} = State, _) when Algo == dh_anon; + Algo == ecdh_anon; + Algo == psk; + Algo == dhe_psk; + Algo == srp_anon -> State; certify_server(#state{cert_db = CertDbHandle, @@ -1297,10 +1380,11 @@ key_exchange(#state{role = server, key_algorithm = dhe_psk, SecParams = ConnectionState#connection_state.security_parameters, #security_parameters{client_random = ClientRandom, server_random = ServerRandom} = SecParams, - Msg = ssl_handshake:key_exchange(server, Version, {dhe_psk, PskIdentityHint, DHKeys, Params, - HashSignAlgo, ClientRandom, - ServerRandom, - PrivateKey}), + Msg = ssl_handshake:key_exchange(server, Version, {dhe_psk, + PskIdentityHint, DHKeys, Params, + HashSignAlgo, ClientRandom, + ServerRandom, + PrivateKey}), State = Connection:send_handshake(Msg, State0), State#state{diffie_hellman_keys = DHKeys}; @@ -1389,7 +1473,8 @@ key_exchange(#state{role = client, ssl_options = SslOpts, key_algorithm = psk, negotiated_version = Version} = State0, Connection) -> - Msg = ssl_handshake:key_exchange(client, Version, {psk, SslOpts#ssl_options.psk_identity}), + Msg = ssl_handshake:key_exchange(client, Version, + {psk, SslOpts#ssl_options.psk_identity}), Connection:send_handshake(Msg, State0); key_exchange(#state{role = client, @@ -1398,7 +1483,8 @@ key_exchange(#state{role = client, negotiated_version = Version, diffie_hellman_keys = {DhPubKey, _}} = State0, Connection) -> Msg = ssl_handshake:key_exchange(client, Version, - {dhe_psk, SslOpts#ssl_options.psk_identity, DhPubKey}), + {dhe_psk, + SslOpts#ssl_options.psk_identity, DhPubKey}), Connection:send_handshake(Msg, State0); key_exchange(#state{role = client, ssl_options = SslOpts, @@ -1438,7 +1524,8 @@ rsa_key_exchange(Version, PremasterSecret, PublicKeyInfo = {Algorithm, _, _}) rsa_key_exchange(_, _, _) -> throw (?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE)). -rsa_psk_key_exchange(Version, PskIdentity, PremasterSecret, PublicKeyInfo = {Algorithm, _, _}) +rsa_psk_key_exchange(Version, PskIdentity, PremasterSecret, + PublicKeyInfo = {Algorithm, _, _}) when Algorithm == ?rsaEncryption; Algorithm == ?md2WithRSAEncryption; Algorithm == ?md5WithRSAEncryption; @@ -1473,10 +1560,11 @@ request_client_cert(#state{ssl_options = #ssl_options{verify = verify_none}} = State, _) -> State. -calculate_master_secret(PremasterSecret, #state{negotiated_version = Version, - connection_states = ConnectionStates0, - session = Session0} = State0, Connection, - Current, Next) -> +calculate_master_secret(PremasterSecret, + #state{negotiated_version = Version, + connection_states = ConnectionStates0, + session = Session0} = State0, Connection, + _Current, Next) -> case ssl_handshake:master_secret(record_cb(Connection), Version, PremasterSecret, ConnectionStates0, server) of {MasterSecret, ConnectionStates} -> @@ -1484,7 +1572,7 @@ calculate_master_secret(PremasterSecret, #state{negotiated_version = Version, State1 = State0#state{connection_states = ConnectionStates, session = Session}, {Record, State} = Connection:next_record(State1), - Connection:next_state(Current, Next, Record, State); + Connection:next_event(Next, Record, State); #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, certify, State0) end. @@ -1535,31 +1623,36 @@ save_verify_data(client, #finished{verify_data = Data}, ConnectionStates, abbrev save_verify_data(server, #finished{verify_data = Data}, ConnectionStates, abbreviated) -> ssl_record:set_server_verify_data(current_write, Data, ConnectionStates). -calculate_secret(#server_dh_params{dh_p = Prime, dh_g = Base, dh_y = ServerPublicDhKey} = Params, - State, Connection) -> +calculate_secret(#server_dh_params{dh_p = Prime, dh_g = Base, + dh_y = ServerPublicDhKey} = Params, + State, Connection) -> Keys = {_, PrivateDhKey} = crypto:generate_key(dh, [Prime, Base]), PremasterSecret = ssl_handshake:premaster_secret(ServerPublicDhKey, PrivateDhKey, Params), calculate_master_secret(PremasterSecret, - State#state{diffie_hellman_keys = Keys}, Connection, certify, certify); + State#state{diffie_hellman_keys = Keys}, + Connection, certify, certify); calculate_secret(#server_ecdh_params{curve = ECCurve, public = ECServerPubKey}, State, Connection) -> ECDHKeys = public_key:generate_key(ECCurve), - PremasterSecret = ssl_handshake:premaster_secret(#'ECPoint'{point = ECServerPubKey}, ECDHKeys), + PremasterSecret = + ssl_handshake:premaster_secret(#'ECPoint'{point = ECServerPubKey}, ECDHKeys), calculate_master_secret(PremasterSecret, - State#state{diffie_hellman_keys = ECDHKeys}, Connection, certify, certify); + State#state{diffie_hellman_keys = ECDHKeys}, + Connection, certify, certify); calculate_secret(#server_psk_params{ - hint = IdentityHint}, + hint = IdentityHint}, State0, Connection) -> %% store for later use {Record, State} = Connection:next_record(State0#state{psk_identity = IdentityHint}), - Connection:next_state(certify, certify, Record, State); + Connection:next_event(certify, Record, State); calculate_secret(#server_dhe_psk_params{ dh_params = #server_dh_params{dh_p = Prime, dh_g = Base}} = ServerKey, - #state{ssl_options = #ssl_options{user_lookup_fun = PSKLookup}} = State, Connection) -> + #state{ssl_options = #ssl_options{user_lookup_fun = PSKLookup}} = + State, Connection) -> Keys = {_, PrivateDhKey} = crypto:generate_key(dh, [Prime, Base]), PremasterSecret = ssl_handshake:premaster_secret(ServerKey, PrivateDhKey, PSKLookup), @@ -1567,10 +1660,12 @@ calculate_secret(#server_dhe_psk_params{ Connection, certify, certify); calculate_secret(#server_srp_params{srp_n = Prime, srp_g = Generator} = ServerKey, - #state{ssl_options = #ssl_options{srp_identity = SRPId}} = State, Connection) -> + #state{ssl_options = #ssl_options{srp_identity = SRPId}} = State, + Connection) -> Keys = generate_srp_client_keys(Generator, Prime, 0), PremasterSecret = ssl_handshake:premaster_secret(ServerKey, Keys, SRPId), - calculate_master_secret(PremasterSecret, State#state{srp_keys = Keys}, Connection, certify, certify). + calculate_master_secret(PremasterSecret, State#state{srp_keys = Keys}, Connection, + certify, certify). master_secret(#alert{} = Alert, _) -> Alert; @@ -1626,21 +1721,23 @@ handle_srp_identity(Username, {Fun, UserState}) -> end. -cipher_role(client, Data, Session, #state{connection_states = ConnectionStates0} = State, +cipher_role(client, Data, Session, #state{connection_states = ConnectionStates0} = State0, Connection) -> - ConnectionStates = ssl_record:set_server_verify_data(current_both, Data, ConnectionStates0), - Connection:next_state_connection(cipher, - ack_connection( - State#state{session = Session, - connection_states = ConnectionStates})); - + ConnectionStates = ssl_record:set_server_verify_data(current_both, Data, + ConnectionStates0), + {Record, State} = prepare_connection(State0#state{session = Session, + connection_states = ConnectionStates}, + Connection), + Connection:next_event(connection, Record, State); cipher_role(server, Data, Session, #state{connection_states = ConnectionStates0} = State0, Connection) -> - ConnectionStates1 = ssl_record:set_client_verify_data(current_read, Data, ConnectionStates0), - State = + ConnectionStates1 = ssl_record:set_client_verify_data(current_read, Data, + ConnectionStates0), + State1 = finalize_handshake(State0#state{connection_states = ConnectionStates1, session = Session}, cipher, Connection), - Connection:next_state_connection(cipher, ack_connection(State#state{session = Session})). + {Record, State} = prepare_connection(State1, Connection), + Connection:next_event(connection, Record, State). select_curve(#state{client_ecc = {[Curve|_], _}}) -> {namedCurve, Curve}; @@ -1674,8 +1771,8 @@ record_cb(tls_connection) -> record_cb(dtls_connection) -> dtls_record. -sync_send_all_state_event(FsmPid, Event) -> - try gen_fsm:sync_send_all_state_event(FsmPid, Event, infinity) +call(FsmPid, Event) -> + try gen_statem:call(FsmPid, Event) catch exit:{noproc, _} -> {error, closed}; @@ -1731,38 +1828,42 @@ set_socket_opts(Transport, Socket, [], SockOpts, Other) -> {{error, {options, {socket_options, Other, Error}}}, SockOpts} end; -set_socket_opts(Transport,Socket, [{mode, Mode}| Opts], SockOpts, Other) when Mode == list; Mode == binary -> +set_socket_opts(Transport,Socket, [{mode, Mode}| Opts], SockOpts, Other) + when Mode == list; Mode == binary -> set_socket_opts(Transport, Socket, Opts, SockOpts#socket_options{mode = Mode}, Other); set_socket_opts(_, _, [{mode, _} = Opt| _], SockOpts, _) -> {{error, {options, {socket_options, Opt}}}, SockOpts}; -set_socket_opts(Transport,Socket, [{packet, Packet}| Opts], SockOpts, Other) when Packet == raw; - Packet == 0; - Packet == 1; - Packet == 2; - Packet == 4; - Packet == asn1; - Packet == cdr; - Packet == sunrm; - Packet == fcgi; - Packet == tpkt; - Packet == line; - Packet == http; - Packet == httph; - Packet == http_bin; - Packet == httph_bin -> +set_socket_opts(Transport,Socket, [{packet, Packet}| Opts], SockOpts, Other) + when Packet == raw; + Packet == 0; + Packet == 1; + Packet == 2; + Packet == 4; + Packet == asn1; + Packet == cdr; + Packet == sunrm; + Packet == fcgi; + Packet == tpkt; + Packet == line; + Packet == http; + Packet == httph; + Packet == http_bin; + Packet == httph_bin -> set_socket_opts(Transport, Socket, Opts, SockOpts#socket_options{packet = Packet}, Other); set_socket_opts(_, _, [{packet, _} = Opt| _], SockOpts, _) -> {{error, {options, {socket_options, Opt}}}, SockOpts}; -set_socket_opts(Transport, Socket, [{header, Header}| Opts], SockOpts, Other) when is_integer(Header) -> +set_socket_opts(Transport, Socket, [{header, Header}| Opts], SockOpts, Other) + when is_integer(Header) -> set_socket_opts(Transport, Socket, Opts, SockOpts#socket_options{header = Header}, Other); set_socket_opts(_, _, [{header, _} = Opt| _], SockOpts, _) -> {{error,{options, {socket_options, Opt}}}, SockOpts}; -set_socket_opts(Transport, Socket, [{active, Active}| Opts], SockOpts, Other) when Active == once; - Active == true; - Active == false -> +set_socket_opts(Transport, Socket, [{active, Active}| Opts], SockOpts, Other) + when Active == once; + Active == true; + Active == false -> set_socket_opts(Transport, Socket, Opts, SockOpts#socket_options{active = Active}, Other); set_socket_opts(_, _, [{active, _} = Opt| _], SockOpts, _) -> @@ -1775,11 +1876,10 @@ start_or_recv_cancel_timer(infinity, _RecvFrom) -> start_or_recv_cancel_timer(Timeout, RecvFrom) -> erlang:send_after(Timeout, self(), {cancel_start_or_recv, RecvFrom}). -get_timeout(#state{ssl_options=#ssl_options{hibernate_after = undefined}}) -> - infinity; -get_timeout(#state{ssl_options=#ssl_options{hibernate_after = HibernateAfter}}) -> - HibernateAfter. - +hibernate_after(StateName, #state{ssl_options=#ssl_options{hibernate_after = HibernateAfter}} = State, + Actions) -> + {next_state, StateName, State, [{timeout, HibernateAfter, hibernate} | Actions]}. + terminate_alert(normal, Version, ConnectionStates) -> ssl_alert:encode(?ALERT_REC(?WARNING, ?CLOSE_NOTIFY), Version, ConnectionStates); @@ -1789,10 +1889,12 @@ terminate_alert({Reason, _}, Version, ConnectionStates) when Reason == close; Version, ConnectionStates); terminate_alert(_, Version, ConnectionStates) -> - ssl_alert:encode(?ALERT_REC(?FATAL, ?INTERNAL_ERROR), - Version, ConnectionStates). + {BinAlert, _} = ssl_alert:encode(?ALERT_REC(?FATAL, ?INTERNAL_ERROR), + Version, ConnectionStates), + BinAlert. -handle_trusted_certs_db(#state{ssl_options = #ssl_options{cacertfile = <<>>, cacerts = []}}) -> +handle_trusted_certs_db(#state{ssl_options = + #ssl_options{cacertfile = <<>>, cacerts = []}}) -> %% No trusted certs specified ok; handle_trusted_certs_db(#state{cert_db_ref = Ref, @@ -1802,7 +1904,8 @@ handle_trusted_certs_db(#state{cert_db_ref = Ref, %% with other connections and it is safe to delete them when the connection ends. ssl_pkix_db:remove_trusted_certs(Ref, CertDb); handle_trusted_certs_db(#state{file_ref_db = undefined}) -> - %% Something went wrong early (typically cacertfile does not exist) so there is nothing to handle + %% Something went wrong early (typically cacertfile does not + %% exist) so there is nothing to handle ok; handle_trusted_certs_db(#state{cert_db_ref = Ref, file_ref_db = RefDb, @@ -1814,29 +1917,31 @@ handle_trusted_certs_db(#state{cert_db_ref = Ref, ok end. -notify_senders(SendQueue) -> - lists:foreach(fun({From, _}) -> - gen_fsm:reply(From, {error, closed}) - end, queue:to_list(SendQueue)). - -notify_renegotiater({true, From}) when not is_atom(From) -> - gen_fsm:reply(From, {error, closed}); -notify_renegotiater(_) -> - ok. +prepare_connection(#state{renegotiation = Renegotiate, + start_or_recv_from = RecvFrom} = State0, Connection) + when Renegotiate =/= {false, first}, + RecvFrom =/= undefined -> + State1 = Connection:reinit_handshake_data(State0), + {Record, State} = Connection:next_record(State1), + {Record, ack_connection(State)}; +prepare_connection(State0, Connection) -> + State = Connection:reinit_handshake_data(State0), + {no_record, ack_connection(State)}. ack_connection(#state{renegotiation = {true, Initiater}} = State) when Initiater == internal; Initiater == peer -> State#state{renegotiation = undefined}; ack_connection(#state{renegotiation = {true, From}} = State) -> - gen_fsm:reply(From, ok), + gen_statem:reply(From, ok), State#state{renegotiation = undefined}; ack_connection(#state{renegotiation = {false, first}, start_or_recv_from = StartFrom, timer = Timer} = State) when StartFrom =/= undefined -> - gen_fsm:reply(StartFrom, connected), + gen_statem:reply(StartFrom, connected), cancel_timer(Timer), - State#state{renegotiation = undefined, start_or_recv_from = undefined, timer = undefined}; + State#state{renegotiation = undefined, + start_or_recv_from = undefined, timer = undefined}; ack_connection(State) -> State. @@ -1857,13 +1962,14 @@ register_session(server, _, Port, #session{is_resumable = new} = Session0) -> register_session(_, _, _, Session) -> Session. %% Already registered -handle_new_session(NewId, CipherSuite, Compression, #state{session = Session0, - protocol_cb = Connection} = State0) -> +handle_new_session(NewId, CipherSuite, Compression, + #state{session = Session0, + protocol_cb = Connection} = State0) -> Session = Session0#session{session_id = NewId, cipher_suite = CipherSuite, compression_method = Compression}, {Record, State} = Connection:next_record(State0#state{session = Session}), - Connection:next_state(hello, certify, Record, State). + Connection:next_event(certify, Record, State). handle_resumed_session(SessId, #state{connection_states = ConnectionStates0, negotiated_version = Version, @@ -1879,7 +1985,7 @@ handle_resumed_session(SessId, #state{connection_states = ConnectionStates0, Connection:next_record(State0#state{ connection_states = ConnectionStates, session = Session}), - Connection:next_state(hello, abbreviated, Record, State); + Connection:next_event(abbreviated, Record, State); #alert{} = Alert -> Connection:handle_own_alert(Alert, Version, hello, State0) end. diff --git a/lib/ssl/src/ssl_connection.hrl b/lib/ssl/src/ssl_connection.hrl index bb41ef2b62..7682cb86ea 100644 --- a/lib/ssl/src/ssl_connection.hrl +++ b/lib/ssl/src/ssl_connection.hrl @@ -75,7 +75,7 @@ renegotiation :: undefined | {boolean(), From::term() | internal | peer}, start_or_recv_from :: term(), timer :: undefined | reference(), % start_or_recive_timer - send_queue :: queue:queue(), + %%send_queue :: queue:queue(), terminated = false ::boolean(), allow_renegotiate = true ::boolean(), expecting_next_protocol_negotiation = false ::boolean(), @@ -83,7 +83,8 @@ negotiated_protocol = undefined :: undefined | binary(), client_ecc, % {Curves, PointFmt} tracker :: pid() | 'undefined', %% Tracker process for listen socket - sni_hostname = undefined + sni_hostname = undefined, + downgrade }). -define(DEFAULT_DIFFIE_HELLMAN_PARAMS, diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl index 2a2a7b7d25..598d4e4112 100644 --- a/lib/ssl/src/ssl_handshake.erl +++ b/lib/ssl/src/ssl_handshake.erl @@ -74,7 +74,7 @@ ]). %% MISC --export([select_version/3, prf/5, select_hashsign/5, +-export([select_version/3, prf/6, select_hashsign/5, select_hashsign_algs/3, premaster_secret/2, premaster_secret/3, premaster_secret/4]). @@ -564,17 +564,15 @@ server_key_exchange_hash(md5sha, Value) -> server_key_exchange_hash(Hash, Value) -> crypto:hash(Hash, Value). %%-------------------------------------------------------------------- --spec prf(ssl_record:ssl_version(), binary(), binary(), [binary()], non_neg_integer()) -> +-spec prf(ssl_record:ssl_version(), non_neg_integer(), binary(), binary(), [binary()], non_neg_integer()) -> {ok, binary()} | {error, undefined}. %% %% Description: use the TLS PRF to generate key material %%-------------------------------------------------------------------- -prf({3,0}, _, _, _, _) -> +prf({3,0}, _, _, _, _, _) -> {error, undefined}; -prf({3,1}, Secret, Label, Seed, WantedLength) -> - {ok, tls_v1:prf(?MD5SHA, Secret, Label, Seed, WantedLength)}; -prf({3,_N}, Secret, Label, Seed, WantedLength) -> - {ok, tls_v1:prf(?SHA256, Secret, Label, Seed, WantedLength)}. +prf({3,_N}, PRFAlgo, Secret, Label, Seed, WantedLength) -> + {ok, tls_v1:prf(PRFAlgo, Secret, Label, Seed, WantedLength)}. %%-------------------------------------------------------------------- diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl index 9c52f5a315..076e663cd4 100644 --- a/lib/ssl/src/ssl_internal.hrl +++ b/lib/ssl/src/ssl_internal.hrl @@ -118,7 +118,7 @@ %% undefined if not hibernating, or number of ms of %% inactivity after which ssl_connection will go into %% hibernation - hibernate_after :: boolean() | 'undefined', + hibernate_after :: timeout(), %% This option should only be set to true by inet_tls_dist erl_dist = false :: boolean(), alpn_advertised_protocols = undefined :: [binary()] | undefined , diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl index a1d13d1850..208edc644a 100644 --- a/lib/ssl/src/tls_connection.erl +++ b/lib/ssl/src/tls_connection.erl @@ -28,7 +28,7 @@ -module(tls_connection). --behaviour(gen_fsm). +-behaviour(gen_statem). -include("tls_connection.hrl"). -include("tls_handshake.hrl"). @@ -43,31 +43,33 @@ %% Internal application API %% Setup --export([start_fsm/8]). +-export([start_fsm/8, start_link/7, init/1]). %% State transition handling --export([next_record/1, next_state/4, next_state_connection/2]). +-export([next_record/1, next_event/3]). %% Handshake handling --export([renegotiate/1, send_handshake/2, send_change_cipher/2]). +-export([renegotiate/2, send_handshake/2, send_change_cipher/2, + reinit_handshake_data/1]). %% Alert and close handling -export([send_alert/2, handle_own_alert/4, handle_close_alert/3, - handle_normal_shutdown/3, handle_unexpected_message/3, + handle_normal_shutdown/3, close/5, alert_user/6, alert_user/9 ]). %% Data handling -export([write_application_data/3, read_application_data/2, - passive_receive/2, next_record_if_active/1]). + passive_receive/2, next_record_if_active/1, handle_common_event/4]). -%% Called by tls_connection_sup --export([start_link/7]). - -%% gen_fsm callbacks --export([init/1, hello/2, certify/2, cipher/2, - abbreviated/2, connection/2, handle_event/3, - handle_sync_event/4, handle_info/3, terminate/3, code_change/4, format_status/2]). +%% gen_statem state functions +-export([init/3, error/3, downgrade/3, %% Initiation and take down states + hello/3, certify/3, cipher/3, abbreviated/3, %% Handshake states + connection/3]). +%% gen_statem callbacks +-export([terminate/3, code_change/4, format_status/2]). + +-define(GEN_STATEM_CB_MODE, state_functions). %%==================================================================== %% Internal application API @@ -130,6 +132,16 @@ send_change_cipher(Msg, #state{connection_states = ConnectionStates0, Transport:send(Socket, BinChangeCipher), State0#state{connection_states = ConnectionStates}. +reinit_handshake_data(State) -> + %% premaster_secret, public_key_info and tls_handshake_info + %% are only needed during the handshake phase. + %% To reduce memory foot print of a connection reinitialize them. + State#state{ + premaster_secret = undefined, + public_key_info = undefined, + tls_handshake_history = ssl_handshake:init_handshake_history() + }. + %%==================================================================== %% tls_connection_sup API %%==================================================================== @@ -147,23 +159,34 @@ start_link(Role, Host, Port, Socket, Options, User, CbInfo) -> init([Role, Host, Port, Socket, Options, User, CbInfo]) -> process_flag(trap_exit, true), - State = initial_state(Role, Host, Port, Socket, Options, User, CbInfo), - gen_fsm:enter_loop(?MODULE, [], hello, State, get_timeout(State)). + State0 = initial_state(Role, Host, Port, Socket, Options, User, CbInfo), + try + State = ssl_connection:ssl_config(State0#state.ssl_options, Role, State0), + gen_statem:enter_loop(?MODULE, [], ?GEN_STATEM_CB_MODE, init, State) + catch throw:Error -> + gen_statem:enter_loop(?MODULE, [], ?GEN_STATEM_CB_MODE, error, {Error, State0}) + end. %%-------------------------------------------------------------------- -%% Description:There should be one instance of this function for each -%% possible state name. Whenever a gen_fsm receives an event sent -%% using gen_fsm:send_event/2, the instance of this function with the -%% same name as the current state name StateName is called to handle -%% the event. It is also called if a timeout occurs. -%% -hello(start, #state{host = Host, port = Port, role = client, - ssl_options = SslOpts, - session = #session{own_certificate = Cert} = Session0, - session_cache = Cache, session_cache_cb = CacheCb, - transport_cb = Transport, socket = Socket, - connection_states = ConnectionStates0, - renegotiation = {Renegotiation, _}} = State0) -> +%% State functions +%%-------------------------------------------------------------------- +%%-------------------------------------------------------------------- +-spec init(gen_statem:event_type(), + {start, timeout()} | term(), #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- + +init({call, From}, {start, Timeout}, + #state{host = Host, port = Port, role = client, + ssl_options = SslOpts, + session = #session{own_certificate = Cert} = Session0, + transport_cb = Transport, socket = Socket, + connection_states = ConnectionStates0, + renegotiation = {Renegotiation, _}, + session_cache = Cache, + session_cache_cb = CacheCb + } = State0) -> + Timer = ssl_connection:start_or_recv_cancel_timer(Timeout, From), Hello = tls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts, Cache, CacheCb, Renegotiation, Cert), @@ -177,13 +200,36 @@ hello(start, #state{host = Host, port = Port, role = client, negotiated_version = Version, %% Requested version session = Session0#session{session_id = Hello#client_hello.session_id}, - tls_handshake_history = Handshake}, + tls_handshake_history = Handshake, + start_or_recv_from = From, + timer = Timer}, {Record, State} = next_record(State1), - next_state(hello, hello, Record, State); + next_event(hello, Record, State); +init(Type, Event, State) -> + ssl_connection:init(Type, Event, State, ?MODULE). + +%%-------------------------------------------------------------------- +-spec error(gen_statem:event_type(), + {start, timeout()} | term(), #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- -hello(Hello = #client_hello{client_version = ClientVersion, - extensions = #hello_extensions{ec_point_formats = EcPointFormats, - elliptic_curves = EllipticCurves}}, +error({call, From}, {start, _Timeout}, {Error, State}) -> + {stop_and_reply, normal, {reply, From, {error, Error}}, State}; +error({call, From}, Msg, State) -> + handle_call(Msg, From, error, State); +error(_, _, _) -> + {keep_state_and_data, [postpone]}. + +%%-------------------------------------------------------------------- +-spec hello(gen_statem:event_type(), + #hello_request{} | #client_hello{} | #server_hello{} | term(), + #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +hello(internal, #client_hello{client_version = ClientVersion, + extensions = #hello_extensions{ec_point_formats = EcPointFormats, + elliptic_curves = EllipticCurves}} = Hello, State = #state{connection_states = ConnectionStates0, port = Port, session = #session{own_certificate = Cert} = Session0, renegotiation = {Renegotiation, _}, @@ -203,7 +249,8 @@ hello(Hello = #client_hello{client_version = ClientVersion, undefined -> CurrentProtocol; _ -> Protocol0 end, - ssl_connection:hello({common_client_hello, Type, ServerHelloExt}, + + ssl_connection:hello(internal, {common_client_hello, Type, ServerHelloExt}, State#state{connection_states = ConnectionStates, negotiated_version = Version, hashsign_algorithm = HashSign, @@ -211,8 +258,7 @@ hello(Hello = #client_hello{client_version = ClientVersion, client_ecc = {EllipticCurves, EcPointFormats}, negotiated_protocol = Protocol}, ?MODULE) end; - -hello(Hello = #server_hello{}, +hello(internal, #server_hello{} = Hello, #state{connection_states = ConnectionStates0, negotiated_version = ReqVersion, role = client, @@ -225,25 +271,52 @@ hello(Hello = #server_hello{}, ssl_connection:handle_session(Hello, Version, NewId, ConnectionStates, ProtoExt, Protocol, State) end; +hello(info, Event, State) -> + handle_info(Event, hello, State); +hello(Type, Event, State) -> + ssl_connection:hello(Type, Event, State, ?MODULE). -hello(Msg, State) -> - ssl_connection:hello(Msg, State, ?MODULE). - -abbreviated(Msg, State) -> - ssl_connection:abbreviated(Msg, State, ?MODULE). +%%-------------------------------------------------------------------- +-spec abbreviated(gen_statem:event_type(), term(), #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +abbreviated(info, Event, State) -> + handle_info(Event, abbreviated, State); +abbreviated(Type, Event, State) -> + ssl_connection:abbreviated(Type, Event, State, ?MODULE). -certify(Msg, State) -> - ssl_connection:certify(Msg, State, ?MODULE). +%%-------------------------------------------------------------------- +-spec certify(gen_statem:event_type(), term(), #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +certify(info, Event, State) -> + handle_info(Event, certify, State); +certify(Type, Event, State) -> + ssl_connection:certify(Type, Event, State, ?MODULE). -cipher(Msg, State) -> - ssl_connection:cipher(Msg, State, ?MODULE). +%%-------------------------------------------------------------------- +-spec cipher(gen_statem:event_type(), term(), #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +cipher(info, Event, State) -> + handle_info(Event, cipher, State); +cipher(Type, Event, State) -> + ssl_connection:cipher(Type, Event, State, ?MODULE). -connection(#hello_request{}, #state{host = Host, port = Port, - session = #session{own_certificate = Cert} = Session0, - session_cache = Cache, session_cache_cb = CacheCb, - ssl_options = SslOpts, - connection_states = ConnectionStates0, - renegotiation = {Renegotiation, _}} = State0) -> +%%-------------------------------------------------------------------- +-spec connection(gen_statem:event_type(), + #hello_request{} | #client_hello{}| term(), #state{}) -> + gen_statem:state_function_result(). +%%-------------------------------------------------------------------- +connection(info, Event, State) -> + handle_info(Event, connection, State); +connection(internal, #hello_request{}, + #state{host = Host, port = Port, + session = #session{own_certificate = Cert} = Session0, + session_cache = Cache, session_cache_cb = CacheCb, + ssl_options = SslOpts, + connection_states = ConnectionStates0, + renegotiation = {Renegotiation, _}} = State0) -> Hello = tls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts, Cache, CacheCb, Renegotiation, Cert), State1 = send_handshake(Hello, State0), @@ -251,58 +324,49 @@ connection(#hello_request{}, #state{host = Host, port = Port, next_record( State1#state{session = Session0#session{session_id = Hello#client_hello.session_id}}), - next_state(connection, hello, Record, State); - -connection(#client_hello{} = Hello, #state{role = server, allow_renegotiate = true} = State) -> + next_event(hello, Record, State); +connection(internal, #client_hello{} = Hello, + #state{role = server, allow_renegotiate = true} = State) -> %% Mitigate Computational DoS attack %% http://www.educatedguesswork.org/2011/10/ssltls_and_computational_dos.html %% http://www.thc.org/thc-ssl-dos/ Rather than disabling client %% initiated renegotiation we will disallow many client initiated %% renegotiations immediately after each other. erlang:send_after(?WAIT_TO_ALLOW_RENEGOTIATION, self(), allow_renegotiate), - hello(Hello, State#state{allow_renegotiate = false}); - -connection(#client_hello{}, #state{role = server, allow_renegotiate = false} = State0) -> + {next_state, hello, State#state{allow_renegotiate = false}, [{next_event, internal, Hello}]}; +connection(internal, #client_hello{}, + #state{role = server, allow_renegotiate = false} = State0) -> Alert = ?ALERT_REC(?WARNING, ?NO_RENEGOTIATION), - State = send_alert(Alert, State0), - next_state_connection(connection, State); - -connection(Msg, State) -> - ssl_connection:connection(Msg, State, tls_connection). + State1 = send_alert(Alert, State0), + {Record, State} = ssl_connection:prepare_connection(State1, ?MODULE), + next_event(connection, Record, State); +connection(Type, Event, State) -> + ssl_connection:connection(Type, Event, State, ?MODULE). %%-------------------------------------------------------------------- -%% Description: Whenever a gen_fsm receives an event sent using -%% gen_fsm:send_all_state_event/2, this function is called to handle -%% the event. Not currently used! +-spec downgrade(gen_statem:event_type(), term(), #state{}) -> + gen_statem:state_function_result(). %%-------------------------------------------------------------------- -handle_event(_Event, StateName, State) -> - {next_state, StateName, State, get_timeout(State)}. +downgrade(Type, Event, State) -> + ssl_connection:downgrade(Type, Event, State, ?MODULE). %%-------------------------------------------------------------------- -%% Description: Whenever a gen_fsm receives an event sent using -%% gen_fsm:sync_send_all_state_event/2,3, this function is called to handle -%% the event. +%% Event handling functions called by state functions to handle +%% common or unexpected events for the state. %%-------------------------------------------------------------------- -handle_sync_event(Event, From, StateName, State) -> - ssl_connection:handle_sync_event(Event, From, StateName, State). - -%%-------------------------------------------------------------------- -%% Description: This function is called by a gen_fsm when it receives any -%% other message than a synchronous or asynchronous event -%% (or a system message). -%%-------------------------------------------------------------------- - +handle_call(Event, From, StateName, State) -> + ssl_connection:handle_call(Event, From, StateName, State, ?MODULE). + %% raw data from socket, unpack records handle_info({Protocol, _, Data}, StateName, #state{data_tag = Protocol} = State0) -> case next_tls_record(Data, State0) of {Record, State} -> - next_state(StateName, StateName, Record, State); + next_event(StateName, Record, State); #alert{} = Alert -> handle_normal_shutdown(Alert, StateName, State0), - {stop, {shutdown, own_alert}, State0} + {stop, {shutdown, own_alert}} end; - handle_info({CloseTag, Socket}, StateName, #state{socket = Socket, close_tag = CloseTag, negotiated_version = Version} = State) -> @@ -321,32 +385,98 @@ handle_info({CloseTag, Socket}, StateName, ok end, handle_normal_shutdown(?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), StateName, State), - {stop, {shutdown, transport_closed}, State}; - + {stop, {shutdown, transport_closed}}; handle_info(Msg, StateName, State) -> ssl_connection:handle_info(Msg, StateName, State). +handle_common_event(internal, #alert{} = Alert, StateName, + #state{negotiated_version = Version} = State) -> + handle_own_alert(Alert, Version, StateName, State); + +%%% TLS record protocol level handshake messages +handle_common_event(internal, #ssl_tls{type = ?HANDSHAKE, fragment = Data}, + StateName, #state{protocol_buffers = + #protocol_buffers{tls_handshake_buffer = Buf0} = Buffers, + negotiated_version = Version} = State0) -> + + Handle = + fun({#hello_request{} = Packet, _}, {connection, HState}) -> + %% This message should not be included in handshake + %% message hashes. Starts new handshake (renegotiation) + Hs0 = ssl_handshake:init_handshake_history(), + {HState#state{tls_handshake_history = Hs0, + renegotiation = {true, peer}}, + {next_event, internal, Packet}}; + ({#hello_request{}, _}, {next_state, _SName, HState}) -> + %% This message should not be included in handshake + %% message hashes. Already in negotiation so it will be ignored! + {HState, []}; + ({#client_hello{} = Packet, Raw}, {connection, HState0}) -> + HState = handle_sni_extension(Packet, HState0), + Version = Packet#client_hello.client_version, + Hs0 = ssl_handshake:init_handshake_history(), + Hs1 = ssl_handshake:update_handshake_history(Hs0, Raw), + {HState#state{tls_handshake_history = Hs1, + renegotiation = {true, peer}}, + {next_event, internal, Packet}}; + + ({Packet, Raw}, {_SName, HState0 = #state{tls_handshake_history=Hs0}}) -> + HState = handle_sni_extension(Packet, HState0), + Hs1 = ssl_handshake:update_handshake_history(Hs0, Raw), + {HState#state{tls_handshake_history=Hs1}, {next_event, internal, Packet}} + end, + try + {Packets, Buf} = tls_handshake:get_tls_handshake(Version,Data,Buf0), + State1 = State0#state{protocol_buffers = + Buffers#protocol_buffers{tls_packets = Packets, + tls_handshake_buffer = Buf}}, + {State, Events} = tls_handshake_events(Handle, StateName, State1, []), + case StateName of + connection -> + ssl_connection:hibernate_after(StateName, State, Events); + _ -> + {next_state, StateName, State, Events} + end + catch throw:#alert{} = Alert -> + handle_own_alert(Alert, Version, StateName, State0) + end; +%%% TLS record protocol level application data messages +handle_common_event(internal, #ssl_tls{type = ?APPLICATION_DATA, fragment = Data}, StateName, State) -> + {next_state, StateName, State, [{next_event, internal, {application_data, Data}}]}; +%%% TLS record protocol level change cipher messages +handle_common_event(internal, #ssl_tls{type = ?CHANGE_CIPHER_SPEC, fragment = Data}, StateName, State) -> + {next_state, StateName, State, [{next_event, internal, #change_cipher_spec{type = Data}}]}; +%%% TLS record protocol level Alert messages +handle_common_event(internal, #ssl_tls{type = ?ALERT, fragment = EncAlerts}, StateName, + #state{negotiated_version = Version} = State) -> + case decode_alerts(EncAlerts) of + Alerts = [_|_] -> + handle_alerts(Alerts, {next_state, StateName, State}); + #alert{} = Alert -> + handle_own_alert(Alert, Version, StateName, State) + end; +%% Ignore unknown TLS record level protocol messages +handle_common_event(internal, #ssl_tls{type = _Unknown}, StateName, State) -> + {next_state, StateName, State}. + %%-------------------------------------------------------------------- -%% Description:This function is called by a gen_fsm when it is about -%% to terminate. It should be the opposite of Module:init/1 and do any -%% necessary cleaning up. When it returns, the gen_fsm terminates with -%% Reason. The return value is ignored. +%% gen_statem callbacks %%-------------------------------------------------------------------- terminate(Reason, StateName, State) -> catch ssl_connection:terminate(Reason, StateName, State). +format_status(Type, Data) -> + ssl_connection:format_status(Type, Data). + %%-------------------------------------------------------------------- %% code_change(OldVsn, StateName, State, Extra) -> {ok, StateName, NewState} %% Description: Convert process state when code is changed %%-------------------------------------------------------------------- code_change(_OldVsn, StateName, State0, {Direction, From, To}) -> State = convert_state(State0, Direction, From, To), - {ok, StateName, State}; + {?GEN_STATEM_CB_MODE, StateName, State}; code_change(_OldVsn, StateName, State, _) -> - {ok, StateName, State}. - -format_status(Type, Data) -> - ssl_connection:format_status(Type, Data). + {?GEN_STATEM_CB_MODE, StateName, State}. %%-------------------------------------------------------------------- %%% Internal functions @@ -396,7 +526,6 @@ initial_state(Role, Host, Port, Socket, {SSLOptions, SocketOptions, Tracker}, Us renegotiation = {false, first}, allow_renegotiate = SSLOptions#ssl_options.client_renegotiation, start_or_recv_from = undefined, - send_queue = queue:new(), protocol_cb = ?MODULE, tracker = Tracker }. @@ -418,80 +547,6 @@ update_ssl_options_from_sni(OrigSSLOptions, SNIHostname) -> ssl:handle_options(SSLOption, OrigSSLOptions) end. -next_state(Current,_, #alert{} = Alert, #state{negotiated_version = Version} = State) -> - handle_own_alert(Alert, Version, Current, State); - -next_state(_,Next, no_record, State) -> - {next_state, Next, State, get_timeout(State)}; - -next_state(Current, Next, #ssl_tls{type = ?ALERT, fragment = EncAlerts}, #state{negotiated_version = Version} = State) -> - case decode_alerts(EncAlerts) of - Alerts = [_|_] -> - handle_alerts(Alerts, {next_state, Next, State, get_timeout(State)}); - #alert{} = Alert -> - handle_own_alert(Alert, Version, Current, State) - end; -next_state(Current, Next, #ssl_tls{type = ?HANDSHAKE, fragment = Data}, - State0 = #state{protocol_buffers = - #protocol_buffers{tls_handshake_buffer = Buf0} = Buffers, - negotiated_version = Version}) -> - Handle = - fun({#hello_request{} = Packet, _}, {next_state, connection = SName, State}) -> - %% This message should not be included in handshake - %% message hashes. Starts new handshake (renegotiation) - Hs0 = ssl_handshake:init_handshake_history(), - ?MODULE:SName(Packet, State#state{tls_handshake_history=Hs0, - renegotiation = {true, peer}}); - ({#hello_request{} = Packet, _}, {next_state, SName, State}) -> - %% This message should not be included in handshake - %% message hashes. Already in negotiation so it will be ignored! - ?MODULE:SName(Packet, State); - ({#client_hello{} = Packet, Raw}, {next_state, connection = SName, HState0}) -> - HState = handle_sni_extension(Packet, HState0), - Version = Packet#client_hello.client_version, - Hs0 = ssl_handshake:init_handshake_history(), - Hs1 = ssl_handshake:update_handshake_history(Hs0, Raw), - ?MODULE:SName(Packet, HState#state{tls_handshake_history=Hs1, - renegotiation = {true, peer}}); - ({Packet, Raw}, {next_state, SName, HState0 = #state{tls_handshake_history=Hs0}}) -> - HState = handle_sni_extension(Packet, HState0), - Hs1 = ssl_handshake:update_handshake_history(Hs0, Raw), - ?MODULE:SName(Packet, HState#state{tls_handshake_history=Hs1}); - (_, StopState) -> StopState - end, - try - {Packets, Buf} = tls_handshake:get_tls_handshake(Version,Data,Buf0), - State = State0#state{protocol_buffers = - Buffers#protocol_buffers{tls_packets = Packets, - tls_handshake_buffer = Buf}}, - handle_tls_handshake(Handle, Next, State) - catch throw:#alert{} = Alert -> - handle_own_alert(Alert, Version, Current, State0) - end; - -next_state(_, StateName, #ssl_tls{type = ?APPLICATION_DATA, fragment = Data}, State0) -> - case read_application_data(Data, State0) of - Stop = {stop,_,_} -> - Stop; - {Record, State} -> - next_state(StateName, StateName, Record, State) - end; -next_state(Current, Next, #ssl_tls{type = ?CHANGE_CIPHER_SPEC, fragment = <<1>>} = - _ChangeCipher, - #state{connection_states = ConnectionStates0} = State0) - when Next == cipher; Next == abbreviated -> - ConnectionStates1 = - ssl_record:activate_pending_connection_state(ConnectionStates0, read), - {Record, State} = next_record(State0#state{connection_states = ConnectionStates1}), - next_state(Current, Next, Record, State#state{expecting_finished = true}); -next_state(Current, _Next, #ssl_tls{type = ?CHANGE_CIPHER_SPEC, fragment = <<1>>} = - _ChangeCipher, #state{negotiated_version = Version} = State) -> - handle_own_alert(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE), Version, Current, State); -next_state(Current, Next, #ssl_tls{type = _Unknown}, State0) -> - %% Ignore unknown type - {Record, State} = next_record(State0), - next_state(Current, Next, Record, State). - next_tls_record(Data, #state{protocol_buffers = #protocol_buffers{tls_record_buffer = Buf0, tls_cipher_texts = CT0} = Buffers} = State0) -> case tls_record:get_tls_records(Data, Buf0) of @@ -504,11 +559,6 @@ next_tls_record(Data, #state{protocol_buffers = #protocol_buffers{tls_record_buf Alert end. -next_record(#state{protocol_buffers = #protocol_buffers{tls_packets = [], tls_cipher_texts = []}, - socket = Socket, - transport_cb = Transport} = State) -> - ssl_socket:setopts(Transport, Socket, [{active,once}]), - {no_record, State}; next_record(#state{protocol_buffers = #protocol_buffers{tls_packets = [], tls_cipher_texts = [CT | Rest]} = Buffers, @@ -522,6 +572,11 @@ next_record(#state{protocol_buffers = #alert{} = Alert -> {Alert, State} end; +next_record(#state{protocol_buffers = #protocol_buffers{tls_packets = [], tls_cipher_texts = []}, + socket = Socket, + transport_cb = Transport} = State) -> + ssl_socket:setopts(Transport, Socket, [{active,once}]), + {no_record, State}; next_record(State) -> {no_record, State}. @@ -533,55 +588,36 @@ next_record_if_active(State = next_record_if_active(State) -> next_record(State). -next_state_connection(StateName, #state{send_queue = Queue0, - negotiated_version = Version, - socket = Socket, - transport_cb = Transport, - connection_states = ConnectionStates0 - } = State) -> - %% Send queued up data that was queued while renegotiating - case queue:out(Queue0) of - {{value, {From, Data}}, Queue} -> - {Msgs, ConnectionStates} = - ssl_record:encode_data(Data, Version, ConnectionStates0), - Result = Transport:send(Socket, Msgs), - gen_fsm:reply(From, Result), - next_state_connection(StateName, - State#state{connection_states = ConnectionStates, - send_queue = Queue}); - {empty, Queue0} -> - next_state_is_connection(StateName, State) - end. - -%% In next_state_is_connection/1: clear tls_handshake, -%% premaster_secret and public_key_info (only needed during handshake) -%% to reduce memory foot print of a connection. -next_state_is_connection(_, State = - #state{start_or_recv_from = RecvFrom, - socket_options = - #socket_options{active = false}}) when RecvFrom =/= undefined -> - passive_receive(State#state{premaster_secret = undefined, - public_key_info = undefined, - tls_handshake_history = ssl_handshake:init_handshake_history()}, connection); - -next_state_is_connection(StateName, State0) -> - {Record, State} = next_record_if_active(State0), - next_state(StateName, connection, Record, State#state{premaster_secret = undefined, - public_key_info = undefined, - tls_handshake_history = ssl_handshake:init_handshake_history()}). - passive_receive(State0 = #state{user_data_buffer = Buffer}, StateName) -> case Buffer of <<>> -> {Record, State} = next_record(State0), - next_state(StateName, StateName, Record, State); + next_event(StateName, Record, State); _ -> - case read_application_data(<<>>, State0) of - Stop = {stop, _, _} -> - Stop; - {Record, State} -> - next_state(StateName, StateName, Record, State) - end + {Record, State} = read_application_data(<<>>, State0), + next_event(StateName, Record, State) + end. + +next_event(StateName, Record, State) -> + next_event(StateName, Record, State, []). + +next_event(connection = StateName, no_record, State0, Actions) -> + case next_record_if_active(State0) of + {no_record, State} -> + ssl_connection:hibernate_after(StateName, State, Actions); + {#ssl_tls{} = Record, State} -> + {next_state, StateName, State, [{next_event, internal, {tls_record, Record}} | Actions]}; + {#alert{} = Alert, State} -> + {next_state, StateName, State, [{next_event, internal, Alert} | Actions]} + end; +next_event(StateName, Record, State, Actions) -> + case Record of + no_record -> + {next_state, StateName, State, Actions}; + #ssl_tls{} = Record -> + {next_state, StateName, State, [{next_event, internal, {tls_record, Record}} | Actions]}; + #alert{} = Alert -> + {next_state, StateName, State, [{next_event, internal, Alert} | Actions]} end. read_application_data(Data, #state{user_application = {_Mon, Pid}, @@ -625,11 +661,6 @@ read_application_data(Data, #state{user_application = {_Mon, Pid}, {stop, normal, State0} end. -get_timeout(#state{ssl_options=#ssl_options{hibernate_after = undefined}}) -> - infinity; -get_timeout(#state{ssl_options=#ssl_options{hibernate_after = HibernateAfter}}) -> - HibernateAfter. - %% Picks ClientData get_data(_, _, <<>>) -> {more, <<>>}; @@ -736,7 +767,7 @@ header(N, Binary) -> [ByteN | header(N-1, NewBinary)]. send_or_reply(false, _Pid, From, Data) when From =/= undefined -> - gen_fsm:reply(From, Data); + gen_statem:reply(From, Data); %% Can happen when handling own alert or tcp error/close and there is %% no outstanding gen_fsm sync events send_or_reply(false, no_pid, _, _) -> @@ -747,51 +778,43 @@ send_or_reply(_, Pid, _From, Data) -> send_user(Pid, Msg) -> Pid ! Msg. -handle_tls_handshake(Handle, StateName, - #state{protocol_buffers = - #protocol_buffers{tls_packets = [Packet]} = Buffers} = State) -> - FsmReturn = {next_state, StateName, State#state{protocol_buffers = - Buffers#protocol_buffers{tls_packets = []}}}, - Handle(Packet, FsmReturn); - -handle_tls_handshake(Handle, StateName, - #state{protocol_buffers = - #protocol_buffers{tls_packets = [Packet | Packets]} = Buffers} = - State0) -> - FsmReturn = {next_state, StateName, State0#state{protocol_buffers = - Buffers#protocol_buffers{tls_packets = - Packets}}}, - case Handle(Packet, FsmReturn) of - {next_state, NextStateName, State, _Timeout} -> - handle_tls_handshake(Handle, NextStateName, State); - {next_state, NextStateName, State} -> - handle_tls_handshake(Handle, NextStateName, State); - {stop, _,_} = Stop -> - Stop - end; - -handle_tls_handshake(_Handle, _StateName, #state{}) -> - throw(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE)). +tls_handshake_events(Handle, StateName, + #state{protocol_buffers = + #protocol_buffers{tls_packets = [Packet]} = Buffers} = State0, Acc) -> + {State, Event} = Handle(Packet, {StateName, + State0#state{protocol_buffers = + Buffers#protocol_buffers{tls_packets = []}}}), + {State, lists:reverse([Event |Acc])}; +tls_handshake_events(Handle, StateName, + #state{protocol_buffers = + #protocol_buffers{tls_packets = + [Packet | Packets]} = Buffers} = State0, Acc) -> + {State, Event} = Handle(Packet, {StateName, State0#state{protocol_buffers = + Buffers#protocol_buffers{tls_packets = + Packets}}}), + tls_handshake_events(Handle, StateName, State, [Event | Acc]); + +tls_handshake_events(_Handle, _, #state{}, _) -> + throw(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE)). write_application_data(Data0, From, #state{socket = Socket, negotiated_version = Version, transport_cb = Transport, connection_states = ConnectionStates0, - send_queue = SendQueue, socket_options = SockOpts, ssl_options = #ssl_options{renegotiate_at = RenegotiateAt}} = State) -> Data = encode_packet(Data0, SockOpts), case time_to_renegotiate(Data, ConnectionStates0, RenegotiateAt) of true -> - renegotiate(State#state{send_queue = queue:in_r({From, Data}, SendQueue), - renegotiation = {true, internal}}); + renegotiate(State#state{renegotiation = {true, internal}}, + [{next_event, {call, From}, {application_data, Data0}}]); false -> {Msgs, ConnectionStates} = ssl_record:encode_data(Data, Version, ConnectionStates0), Result = Transport:send(Socket, Msgs), - {reply, Result, - connection, State#state{connection_states = ConnectionStates}, get_timeout(State)} + ssl_connection:hibernate_after(connection, State#state{connection_states = ConnectionStates}, + [{reply, From, Result}]) end. encode_packet(Data, #socket_options{packet=Packet}) -> @@ -823,69 +846,73 @@ is_time_to_renegotiate(N, M) when N < M-> false; is_time_to_renegotiate(_,_) -> true. -renegotiate(#state{role = client} = State) -> +renegotiate(#state{role = client} = State, Actions) -> %% Handle same way as if server requested %% the renegotiation Hs0 = ssl_handshake:init_handshake_history(), - connection(#hello_request{}, State#state{tls_handshake_history = Hs0}); + {next_state, connection, State#state{tls_handshake_history = Hs0}, + [{next_event, internal, #hello_request{}} | Actions]}; + renegotiate(#state{role = server, socket = Socket, transport_cb = Transport, negotiated_version = Version, - connection_states = ConnectionStates0} = State0) -> + connection_states = ConnectionStates0} = State0, Actions) -> HelloRequest = ssl_handshake:hello_request(), Frag = tls_handshake:encode_handshake(HelloRequest, Version), Hs0 = ssl_handshake:init_handshake_history(), {BinMsg, ConnectionStates} = ssl_record:encode_handshake(Frag, Version, ConnectionStates0), Transport:send(Socket, BinMsg), - {Record, State} = next_record(State0#state{connection_states = - ConnectionStates, - tls_handshake_history = Hs0}), - next_state(connection, hello, Record, State#state{allow_renegotiate = true}). + State1 = State0#state{connection_states = + ConnectionStates, + tls_handshake_history = Hs0}, + {Record, State} = next_record(State1), + next_event(hello, Record, State, Actions). handle_alerts([], Result) -> Result; -handle_alerts(_, {stop, _, _} = Stop) -> - %% If it is a fatal alert immediately close +handle_alerts(_, {stop,_} = Stop) -> Stop; -handle_alerts([Alert | Alerts], {next_state, StateName, State, _Timeout}) -> - handle_alerts(Alerts, handle_alert(Alert, StateName, State)). - +handle_alerts([Alert | Alerts], {next_state, StateName, State}) -> + handle_alerts(Alerts, handle_alert(Alert, StateName, State)); +handle_alerts([Alert | Alerts], {next_state, StateName, State, _Actions}) -> + handle_alerts(Alerts, handle_alert(Alert, StateName, State)). handle_alert(#alert{level = ?FATAL} = Alert, StateName, #state{socket = Socket, transport_cb = Transport, ssl_options = SslOpts, start_or_recv_from = From, host = Host, port = Port, session = Session, user_application = {_Mon, Pid}, - role = Role, socket_options = Opts, tracker = Tracker} = State) -> + role = Role, socket_options = Opts, tracker = Tracker}) -> invalidate_session(Role, Host, Port, Session), log_alert(SslOpts#ssl_options.log_alert, StateName, Alert), alert_user(Transport, Tracker, Socket, StateName, Opts, Pid, From, Alert, Role), - {stop, normal, State}; + {stop, normal}; handle_alert(#alert{level = ?WARNING, description = ?CLOSE_NOTIFY} = Alert, StateName, State) -> handle_normal_shutdown(Alert, StateName, State), - {stop, {shutdown, peer_close}, State}; + {stop, {shutdown, peer_close}}; handle_alert(#alert{level = ?WARNING, description = ?NO_RENEGOTIATION} = Alert, StateName, #state{ssl_options = SslOpts, renegotiation = {true, internal}} = State) -> log_alert(SslOpts#ssl_options.log_alert, StateName, Alert), handle_normal_shutdown(Alert, StateName, State), - {stop, {shutdown, peer_close}, State}; + {stop, {shutdown, peer_close}}; handle_alert(#alert{level = ?WARNING, description = ?NO_RENEGOTIATION} = Alert, StateName, #state{ssl_options = SslOpts, renegotiation = {true, From}} = State0) -> log_alert(SslOpts#ssl_options.log_alert, StateName, Alert), - gen_fsm:reply(From, {error, renegotiation_rejected}), + gen_statem:reply(From, {error, renegotiation_rejected}), {Record, State} = next_record(State0), - next_state(StateName, connection, Record, State); + %% Go back to connection! + next_event(connection, Record, State); %% Gracefully log and ignore all other warning alerts handle_alert(#alert{level = ?WARNING} = Alert, StateName, #state{ssl_options = SslOpts} = State0) -> log_alert(SslOpts#ssl_options.log_alert, StateName, Alert), {Record, State} = next_record(State0), - next_state(StateName, StateName, Record, State). + next_event(StateName, Record, State). alert_user(Transport, Tracker, Socket, connection, Opts, Pid, From, Alert, Role) -> alert_user(Transport, Tracker, Socket, Opts#socket_options.active, Pid, From, Alert, Role); @@ -937,7 +964,7 @@ handle_own_alert(Alert, Version, StateName, catch _:_ -> ok end, - {stop, {shutdown, own_alert}, State}. + {stop, {shutdown, own_alert}}. handle_normal_shutdown(Alert, _, #state{socket = Socket, transport_cb = Transport, @@ -954,11 +981,6 @@ handle_normal_shutdown(Alert, StateName, #state{socket = Socket, start_or_recv_from = RecvFrom, role = Role}) -> alert_user(Transport, Tracker, Socket, StateName, Opts, Pid, RecvFrom, Alert, Role). -handle_unexpected_message(Msg, Info, #state{negotiated_version = Version} = State) -> - Alert = ?ALERT_REC(?FATAL,?UNEXPECTED_MESSAGE), - handle_own_alert(Alert, Version, {Info, Msg}, State). - - handle_close_alert(Data, StateName, State0) -> case next_tls_record(Data, State0) of {#ssl_tls{type = ?ALERT, fragment = EncAlerts}, State} -> @@ -979,27 +1001,6 @@ invalidate_session(client, Host, Port, Session) -> invalidate_session(server, _, Port, Session) -> ssl_manager:invalidate_session(Port, Session). -%% User downgrades connection -%% When downgrading an TLS connection to a transport connection -%% we must recive the close message before releasing the -%% transport socket. -close({close, {Pid, Timeout}}, Socket, Transport, ConnectionStates, Check) when is_pid(Pid) -> - ssl_socket:setopts(Transport, Socket, [{active, false}, {packet, ssl_tls}]), - case Transport:recv(Socket, 0, Timeout) of - {ok, {ssl_tls, Socket, ?ALERT, Version, Fragment}} -> - case tls_record:decode_cipher_text(#ssl_tls{type = ?ALERT, - version = Version, - fragment = Fragment - }, ConnectionStates, Check) of - {#ssl_tls{fragment = Plain}, _} -> - [Alert| _] = decode_alerts(Plain), - downgrade(Alert, Transport, Socket, Pid) - end; - {error, timeout} -> - {error, timeout}; - _ -> - {error, no_tls_close} - end; %% User closes or recursive call! close({close, Timeout}, Socket, Transport = gen_tcp, _,_) -> ssl_socket:setopts(Transport, Socket, [{active, false}]), @@ -1020,15 +1021,11 @@ close({shutdown, own_alert}, Socket, Transport = gen_tcp, ConnectionStates, Chec %% with the network but we want to maximise the odds that %% peer application gets all data sent on the tcp connection. close({close, ?DEFAULT_TIMEOUT}, Socket, Transport, ConnectionStates, Check); +close(downgrade, _,_,_,_) -> + ok; %% Other close(_, Socket, Transport, _,_) -> Transport:close(Socket). -downgrade(#alert{description = ?CLOSE_NOTIFY}, Transport, Socket, Pid) -> - ssl_socket:setopts(Transport, Socket, [{active, false}, {packet, 0}, {mode, binary}]), - Transport:controlling_process(Socket, Pid), - {ok, Socket}; -downgrade(_, _,_,_) -> - {error, no_tls_close}. convert_state(#state{ssl_options = Options} = State, up, "5.3.5", "5.3.6") -> State#state{ssl_options = convert_options_partial_chain(Options, up)}; @@ -1069,4 +1066,3 @@ handle_sni_extension(#client_hello{extensions = HelloExtensions}, State0) -> end; handle_sni_extension(_, State0) -> State0. - diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl index 3fea38078f..9341d2cae7 100644 --- a/lib/ssl/test/ssl_basic_SUITE.erl +++ b/lib/ssl/test/ssl_basic_SUITE.erl @@ -145,7 +145,8 @@ api_tests() -> versions_option, server_name_indication_option, accept_pool, - new_options_in_accept + new_options_in_accept, + prf ]. session_tests() -> @@ -326,6 +327,31 @@ init_per_testcase(rizzo, Config) -> ct:log("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]), ct:timetrap({seconds, 40}), Config; +init_per_testcase(prf, Config) -> + ct:log("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]), + ct:timetrap({seconds, 40}), + case ?config(tc_group_path, Config) of + [] -> Prop = []; + [Prop] -> Prop + end, + case ?config(name, Prop) of + undefined -> TlsVersions = [sslv3, tlsv1, 'tlsv1.1', 'tlsv1.2']; + TlsVersion when is_atom(TlsVersion) -> + TlsVersions = [TlsVersion] + end, + PRFS=[md5, sha, sha256, sha384, sha512], + %All are the result of running tls_v1:prf(PrfAlgo, <<>>, <<>>, <<>>, 16) + %with the specified PRF algorithm + ExpectedPrfResults= + [{md5, <<96,139,180,171,236,210,13,10,28,32,2,23,88,224,235,199>>}, + {sha, <<95,3,183,114,33,169,197,187,231,243,19,242,220,228,70,151>>}, + {sha256, <<166,249,145,171,43,95,158,232,6,60,17,90,183,180,0,155>>}, + {sha384, <<153,182,217,96,186,130,105,85,65,103,123,247,146,91,47,106>>}, + {sha512, <<145,8,98,38,243,96,42,94,163,33,53,49,241,4,127,28>>}, + %TLS 1.0 and 1.1 PRF: + {md5sha, <<63,136,3,217,205,123,200,177,251,211,17,229,132,4,173,80>>}], + TestPlan = prf_create_plan(TlsVersions, PRFS, ExpectedPrfResults), + [{prf_test_plan, TestPlan} | Config]; init_per_testcase(TestCase, Config) when TestCase == ssl_accept_timeout; TestCase == client_closes_socket; @@ -431,6 +457,25 @@ new_options_in_accept(Config) when is_list(Config) -> ssl_test_lib:close(Server), ssl_test_lib:close(Client). %%-------------------------------------------------------------------- +prf() -> + [{doc,"Test that ssl:prf/5 uses the negotiated PRF."}]. +prf(Config) when is_list(Config) -> + TestPlan = ?config(prf_test_plan, Config), + case TestPlan of + [] -> ct:fail({error, empty_prf_test_plan}); + _ -> lists:foreach(fun(Suite) -> + lists:foreach( + fun(Test) -> + V = ?config(tls_ver, Test), + C = ?config(ciphers, Test), + E = ?config(expected, Test), + P = ?config(prf, Test), + prf_run_test(Config, V, C, E, P) + end, Suite) + end, TestPlan) + end. + +%%-------------------------------------------------------------------- connection_info() -> [{doc,"Test the API function ssl:connection_information/1"}]. @@ -720,21 +765,27 @@ clear_pem_cache(Config) when is_list(Config) -> State = ssl_test_lib:state(Prop), [_,FilRefDb |_] = element(6, State), {Server, Client} = basic_verify_test_no_close(Config), - 2 = ets:info(FilRefDb, size), + CountReferencedFiles = fun({_,-1}, Acc) -> + Acc; + ({_, N}, Acc) -> + N + Acc + end, + + 2 = ets:foldl(CountReferencedFiles, 0, FilRefDb), ssl:clear_pem_cache(), _ = sys:get_status(whereis(ssl_manager)), {Server1, Client1} = basic_verify_test_no_close(Config), - 4 = ets:info(FilRefDb, size), + 4 = ets:foldl(CountReferencedFiles, 0, FilRefDb), ssl_test_lib:close(Server), ssl_test_lib:close(Client), - ct:sleep(5000), + ct:sleep(2000), _ = sys:get_status(whereis(ssl_manager)), - 2 = ets:info(FilRefDb, size), + 2 = ets:foldl(CountReferencedFiles, 0, FilRefDb), ssl_test_lib:close(Server1), ssl_test_lib:close(Client1), - ct:sleep(5000), + ct:sleep(2000), _ = sys:get_status(whereis(ssl_manager)), - 0 = ets:info(FilRefDb, size). + 0 = ets:foldl(CountReferencedFiles, 0, FilRefDb). %%-------------------------------------------------------------------- @@ -2565,6 +2616,13 @@ der_input(Config) when is_list(Config) -> DataDir = ?config(data_dir, Config), DHParamFile = filename:join(DataDir, "dHParam.pem"), + {status, _, _, StatusInfo} = sys:get_status(whereis(ssl_manager)), + [_, _,_, _, Prop] = StatusInfo, + State = ssl_test_lib:state(Prop), + [CADb | _] = element(6, State), + + Size = ets:info(CADb, size), + SeverVerifyOpts = ?config(server_verification_opts, Config), {ServerCert, ServerKey, ServerCaCerts, DHParams} = der_input_opts([{dhfile, DHParamFile} | SeverVerifyOpts]), @@ -2592,13 +2650,8 @@ der_input(Config) when is_list(Config) -> ssl_test_lib:check_result(Server, ok, Client, ok), ssl_test_lib:close(Server), ssl_test_lib:close(Client), + Size = ets:info(CADb, size). - {status, _, _, StatusInfo} = sys:get_status(whereis(ssl_manager)), - [_, _,_, _, Prop] = StatusInfo, - State = ssl_test_lib:state(Prop), - [CADb | _] = element(6, State), - [] = ets:tab2list(CADb). - %%-------------------------------------------------------------------- der_input_opts(Opts) -> Certfile = proplists:get_value(certfile, Opts), @@ -3060,6 +3113,7 @@ hibernate(Config) -> {current_function, _} = process_info(Pid, current_function), + ssl_test_lib:check_result(Server, ok, Client, ok), timer:sleep(1100), {current_function, {erlang, hibernate, 3}} = @@ -3093,15 +3147,29 @@ hibernate_right_away(Config) -> Server1 = ssl_test_lib:start_server(StartServerOpts), Port1 = ssl_test_lib:inet_port(Server1), - {Client1, #sslsocket{}} = ssl_test_lib:start_client(StartClientOpts ++ + {Client1, #sslsocket{pid = Pid1}} = ssl_test_lib:start_client(StartClientOpts ++ [{port, Port1}, {options, [{hibernate_after, 0}|ClientOpts]}]), + + ssl_test_lib:check_result(Server1, ok, Client1, ok), + + {current_function, {erlang, hibernate, 3}} = + process_info(Pid1, current_function), + ssl_test_lib:close(Server1), ssl_test_lib:close(Client1), Server2 = ssl_test_lib:start_server(StartServerOpts), Port2 = ssl_test_lib:inet_port(Server2), - {Client2, #sslsocket{}} = ssl_test_lib:start_client(StartClientOpts ++ + {Client2, #sslsocket{pid = Pid2}} = ssl_test_lib:start_client(StartClientOpts ++ [{port, Port2}, {options, [{hibernate_after, 1}|ClientOpts]}]), + + ssl_test_lib:check_result(Server2, ok, Client2, ok), + + ct:sleep(100), %% Schedule out + + {current_function, {erlang, hibernate, 3}} = + process_info(Pid2, current_function), + ssl_test_lib:close(Server2), ssl_test_lib:close(Client2). @@ -3686,6 +3754,81 @@ basic_test(Config) -> ssl_test_lib:close(Server), ssl_test_lib:close(Client). +prf_create_plan(TlsVersions, PRFs, Results) -> + lists:foldl(fun(Ver, Acc) -> + A = prf_ciphers_and_expected(Ver, PRFs, Results), + [A|Acc] + end, [], TlsVersions). +prf_ciphers_and_expected(TlsVer, PRFs, Results) -> + case TlsVer of + TlsVer when TlsVer == sslv3 orelse TlsVer == tlsv1 + orelse TlsVer == 'tlsv1.1' -> + Ciphers = ssl:cipher_suites(), + {_, Expected} = lists:keyfind(md5sha, 1, Results), + [[{tls_ver, TlsVer}, {ciphers, Ciphers}, {expected, Expected}, {prf, md5sha}]]; + 'tlsv1.2' -> + lists:foldl( + fun(PRF, Acc) -> + Ciphers = prf_get_ciphers(TlsVer, PRF), + case Ciphers of + [] -> + ct:log("No ciphers for PRF algorithm ~p. Skipping.", [PRF]), + Acc; + Ciphers -> + {_, Expected} = lists:keyfind(PRF, 1, Results), + [[{tls_ver, TlsVer}, {ciphers, Ciphers}, {expected, Expected}, + {prf, PRF}] | Acc] + end + end, [], PRFs) + end. +prf_get_ciphers(TlsVer, PRF) -> + case TlsVer of + 'tlsv1.2' -> + lists:filter( + fun(C) when tuple_size(C) == 4 andalso + element(4, C) == PRF -> + true; + (_) -> false + end, ssl:cipher_suites()) + end. +prf_run_test(_, TlsVer, [], _, Prf) -> + ct:fail({error, cipher_list_empty, TlsVer, Prf}); +prf_run_test(Config, TlsVer, Ciphers, Expected, Prf) -> + {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + BaseOpts = [{active, true}, {versions, [TlsVer]}, {ciphers, Ciphers}], + ServerOpts = BaseOpts ++ ?config(server_opts, Config), + ClientOpts = BaseOpts ++ ?config(client_opts, Config), + Server = ssl_test_lib:start_server( + [{node, ServerNode}, {port, 0}, {from, self()}, + {mfa, {?MODULE, prf_verify_value, [TlsVer, Expected, Prf]}}, + {options, ServerOpts}]), + Port = ssl_test_lib:inet_port(Server), + Client = ssl_test_lib:start_client( + [{node, ClientNode}, {port, Port}, + {host, Hostname}, {from, self()}, + {mfa, {?MODULE, prf_verify_value, [TlsVer, Expected, Prf]}}, + {options, ClientOpts}]), + ssl_test_lib:check_result(Server, ok, Client, ok), + ssl_test_lib:close(Server), + ssl_test_lib:close(Client). +prf_verify_value(Socket, TlsVer, Expected, Algo) -> + Ret = ssl:prf(Socket, <<>>, <<>>, [<<>>], 16), + case TlsVer of + sslv3 -> + case Ret of + {error, undefined} -> ok; + _ -> + {error, {expected, {error, undefined}, + got, Ret, tls_ver, TlsVer, prf_algorithm, Algo}} + end; + _ -> + case Ret of + {ok, Expected} -> ok; + {ok, Val} -> {error, {expected, Expected, got, Val, tls_ver, TlsVer, + prf_algorithm, Algo}} + end + end. + send_recv_result_timeout_client(Socket) -> {error, timeout} = ssl:recv(Socket, 11, 500), ssl:send(Socket, "Hello world"), diff --git a/lib/ssl/test/ssl_certificate_verify_SUITE.erl b/lib/ssl/test/ssl_certificate_verify_SUITE.erl index 66ccbb1da4..49c0b9c5a1 100644 --- a/lib/ssl/test/ssl_certificate_verify_SUITE.erl +++ b/lib/ssl/test/ssl_certificate_verify_SUITE.erl @@ -52,8 +52,8 @@ groups() -> {error_handling, [],error_handling_tests()}]. tests() -> - [server_verify_peer, - server_verify_none, + [verify_peer, + verify_none, server_require_peer_cert_ok, server_require_peer_cert_fail, server_require_peer_cert_partial_chain, @@ -110,6 +110,17 @@ init_per_group(_, Config) -> end_per_group(_GroupName, Config) -> Config. +init_per_testcase(TestCase, Config) when TestCase == cert_expired; + TestCase == invalid_signature_client; + TestCase == invalid_signature_server; + TestCase == extended_key_usage_verify_none; + TestCase == extended_key_usage_verify_peer; + TestCase == critical_extension_verify_none; + TestCase == critical_extension_verify_peer; + TestCase == no_authority_key_identifier; + TestCase == no_authority_key_identifier_and_nonstandard_encoding-> + ssl:clear_pem_cache(), + init_per_testcase(common, Config); init_per_testcase(_TestCase, Config) -> ct:log("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]), ct:timetrap({seconds, 5}), @@ -122,9 +133,9 @@ end_per_testcase(_TestCase, Config) -> %% Test Cases -------------------------------------------------------- %%-------------------------------------------------------------------- -server_verify_peer() -> - [{doc,"Test server option verify_peer"}]. -server_verify_peer(Config) when is_list(Config) -> +verify_peer() -> + [{doc,"Test option verify_peer"}]. +verify_peer(Config) when is_list(Config) -> ClientOpts = ?config(client_verification_opts, Config), ServerOpts = ?config(server_verification_opts, Config), Active = ?config(active, Config), @@ -147,10 +158,10 @@ server_verify_peer(Config) when is_list(Config) -> ssl_test_lib:close(Client). %%-------------------------------------------------------------------- -server_verify_none() -> - [{doc,"Test server option verify_none"}]. +verify_none() -> + [{doc,"Test option verify_none"}]. -server_verify_none(Config) when is_list(Config) -> +verify_none(Config) when is_list(Config) -> ClientOpts = ?config(client_verification_opts, Config), ServerOpts = ?config(server_verification_opts, Config), Active = ?config(active, Config), @@ -220,18 +231,21 @@ server_require_peer_cert_ok(Config) when is_list(Config) -> ServerOpts = [{verify, verify_peer}, {fail_if_no_peer_cert, true} | ?config(server_verification_opts, Config)], ClientOpts = ?config(client_verification_opts, Config), + Active = ?config(active, Config), + ReceiveFunction = ?config(receive_function, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, {from, self()}, - {mfa, {ssl_test_lib,send_recv_result, []}}, - {options, [{active, false} | ServerOpts]}]), + {mfa, {ssl_test_lib, ReceiveFunction, []}}, + {options, [{active, Active} | ServerOpts]}]), Port = ssl_test_lib:inet_port(Server), Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, {host, Hostname}, {from, self()}, - {mfa, {ssl_test_lib, send_recv_result, []}}, - {options, [{active, false} | ClientOpts]}]), + {mfa, {ssl_test_lib, ReceiveFunction, []}}, + {options, [{active, Active} | ClientOpts]}]), ssl_test_lib:check_result(Server, ok, Client, ok), ssl_test_lib:close(Server), @@ -313,6 +327,8 @@ server_require_peer_cert_allow_partial_chain(Config) when is_list(Config) -> | ?config(server_verification_opts, Config)], ClientOpts = ?config(client_verification_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + Active = ?config(active, Config), + ReceiveFunction = ?config(receive_function, Config), {ok, ServerCAs} = file:read_file(proplists:get_value(cacertfile, ServerOpts)), [{_,_,_}, {_, IntermidiateCA, _}] = public_key:pem_decode(ServerCAs), @@ -328,16 +344,17 @@ server_require_peer_cert_allow_partial_chain(Config) when is_list(Config) -> Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, {from, self()}, - {mfa, {ssl_test_lib, send_recv_result_active, []}}, - {options, [{cacerts, [IntermidiateCA]}, + {mfa, {ssl_test_lib, ReceiveFunction, []}}, + {options, [{active, Active}, + {cacerts, [IntermidiateCA]}, {partial_chain, PartialChain} | proplists:delete(cacertfile, ServerOpts)]}]), Port = ssl_test_lib:inet_port(Server), Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, {host, Hostname}, {from, self()}, - {mfa, {ssl_test_lib, send_recv_result_active, []}}, - {options, ClientOpts}]), + {mfa, {ssl_test_lib, ReceiveFunction, []}}, + {options, [{active, Active} | ClientOpts]}]), ssl_test_lib:check_result(Server, ok, Client, ok), ssl_test_lib:close(Server), ssl_test_lib:close(Client). @@ -522,32 +539,6 @@ verify_fun_always_run_server(Config) when is_list(Config) -> %%-------------------------------------------------------------------- -client_verify_none_passive() -> - [{doc,"Test client option verify_none"}]. - -client_verify_none_passive(Config) when is_list(Config) -> - ClientOpts = ?config(client_opts, Config), - ServerOpts = ?config(server_opts, Config), - {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), - Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, - {from, self()}, - {mfa, {ssl_test_lib, send_recv_result, []}}, - {options, [{active, false} - | ServerOpts]}]), - Port = ssl_test_lib:inet_port(Server), - - Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, - {host, Hostname}, - {from, self()}, - {mfa, {ssl_test_lib, send_recv_result, []}}, - {options, [{active, false}, - {verify, verify_none} - | ClientOpts]}]), - - ssl_test_lib:check_result(Server, ok, Client, ok), - ssl_test_lib:close(Server), - ssl_test_lib:close(Client). -%%-------------------------------------------------------------------- cert_expired() -> [{doc,"Test server with expired certificate"}]. @@ -616,64 +607,6 @@ two_digits_str(N) -> lists:flatten(io_lib:format("~p", [N])). %%-------------------------------------------------------------------- - -client_verify_none_active() -> - [{doc,"Test client option verify_none"}]. - -client_verify_none_active(Config) when is_list(Config) -> - ClientOpts = ?config(client_opts, Config), - ServerOpts = ?config(server_opts, Config), - {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), - Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, - {from, self()}, - {mfa, {ssl_test_lib, - send_recv_result_active, []}}, - {options, [{active, true} - | ServerOpts]}]), - Port = ssl_test_lib:inet_port(Server), - Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, - {host, Hostname}, - {from, self()}, - {mfa, {ssl_test_lib, - send_recv_result_active, []}}, - {options, [{active, true}, - {verify, verify_none} - | ClientOpts]}]), - - ssl_test_lib:check_result(Server, ok, Client, ok), - ssl_test_lib:close(Server), - ssl_test_lib:close(Client). - -%%-------------------------------------------------------------------- -client_verify_none_active_once() -> - [{doc,"Test client option verify_none"}]. - -client_verify_none_active_once(Config) when is_list(Config) -> - ClientOpts = ?config(client_opts, Config), - ServerOpts = ?config(server_opts, Config), - - {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), - Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, - {from, self()}, - {mfa, {ssl_test_lib, send_recv_result_active, []}}, - {options, [{active, once} | ServerOpts]}]), - Port = ssl_test_lib:inet_port(Server), - - Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, - {host, Hostname}, - {from, self()}, - {mfa, {ssl_test_lib, - send_recv_result_active_once, - []}}, - {options, [{active, once}, - {verify, verify_none} - | ClientOpts]}]), - - ssl_test_lib:check_result(Server, ok, Client, ok), - ssl_test_lib:close(Server), - ssl_test_lib:close(Client). - -%%-------------------------------------------------------------------- extended_key_usage_verify_peer() -> [{doc,"Test cert that has a critical extended_key_usage extension in verify_peer mode"}]. diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl index db9e1c3d38..38cc3532d8 100644 --- a/lib/ssl/test/ssl_test_lib.erl +++ b/lib/ssl/test/ssl_test_lib.erl @@ -1041,10 +1041,13 @@ receive_rizzo_duong_beast() -> end end. -state([{data,[{"State", State}]} | _]) -> - State; -state([{data,[{"StateData", State}]} | _]) -> + +state([{data,[{"State", {_StateName, StateData}}]} | _]) -> %% gen_statem + StateData; +state([{data,[{"State", State}]} | _]) -> %% gen_server State; +state([{data,[{"StateData", State}]} | _]) -> %% gen_fsm + State; state([_ | Rest]) -> state(Rest). diff --git a/lib/ssl/vsn.mk b/lib/ssl/vsn.mk index 8c732002de..3b51fa8c6b 100644 --- a/lib/ssl/vsn.mk +++ b/lib/ssl/vsn.mk @@ -1 +1 @@ -SSL_VSN = 7.3.1 +SSL_VSN = 8.0 diff --git a/lib/stdlib/doc/src/gen_statem.xml b/lib/stdlib/doc/src/gen_statem.xml index ec7f267c64..d83e17b177 100644 --- a/lib/stdlib/doc/src/gen_statem.xml +++ b/lib/stdlib/doc/src/gen_statem.xml @@ -396,17 +396,17 @@ handle_event(_, _, State, Data) -> <tag><c>pid()</c><br /> <c>LocalName</c></tag> <item>The <c>gen_statem</c> is locally registered.</item> - <tag><c>Name, Node</c></tag> + <tag><c>{Name,Node}</c></tag> <item> The <c>gen_statem</c> is locally registered on another node. </item> - <tag><c>GlobalName</c></tag> + <tag><c>{global,GlobalName}</c></tag> <item> The <c>gen_statem</c> is globally registered in <seealso marker="kernel:global"><c>global</c></seealso>. </item> - <tag><c>RegMod, ViaName</c></tag> + <tag><c>{via,RegMod,ViaName}</c></tag> <item> The <c>gen_statem</c> is registered through an alternative process registry. diff --git a/lib/stdlib/src/epp.erl b/lib/stdlib/src/epp.erl index 55a818e87c..73934e0e3c 100644 --- a/lib/stdlib/src/epp.erl +++ b/lib/stdlib/src/epp.erl @@ -53,6 +53,8 @@ | {atom(),non_neg_integer()} | tokens(). +-type warning_info() :: {erl_anno:location(), module(), term()}. + -define(DEFAULT_ENCODING, utf8). %% Epp state record. @@ -158,11 +160,13 @@ scan_erl_form(Epp) -> epp_request(Epp, scan_erl_form). -spec parse_erl_form(Epp) -> - {'ok', AbsForm} | {'eof', Line} | {error, ErrorInfo} when + {'ok', AbsForm} | {error, ErrorInfo} | + {'warning',WarningInfo} | {'eof',Line} when Epp :: epp_handle(), AbsForm :: erl_parse:abstract_form(), Line :: erl_anno:line(), - ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(). + ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(), + WarningInfo :: warning_info(). parse_erl_form(Epp) -> case epp_request(Epp, scan_erl_form) of @@ -219,6 +223,10 @@ format_error({illegal_function_usage,Macro}) -> io_lib:format("?~s must not begin a form", [Macro]); format_error({'NYI',What}) -> io_lib:format("not yet implemented '~s'", [What]); +format_error({error,Term}) -> + io_lib:format("-error(~p).", [Term]); +format_error({warning,Term}) -> + io_lib:format("-warning(~p).", [Term]); format_error(E) -> file:format_error(E). -spec parse_file(FileName, IncludePath, PredefMacros) -> @@ -263,9 +271,11 @@ parse_file(Ifile, Options) -> -spec parse_file(Epp) -> [Form] when Epp :: epp_handle(), - Form :: erl_parse:abstract_form() | {'error', ErrorInfo} | {'eof',Line}, + Form :: erl_parse:abstract_form() | {'error', ErrorInfo} | + {'warning',WarningInfo} | {'eof',Line}, Line :: erl_anno:line(), - ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(). + ErrorInfo :: erl_scan:error_info() | erl_parse:error_info(), + WarningInfo :: warning_info(). parse_file(Epp) -> case parse_erl_form(Epp) of @@ -273,6 +283,8 @@ parse_file(Epp) -> [Form|parse_file(Epp)]; {error,E} -> [{error,E}|parse_file(Epp)]; + {warning,W} -> + [{warning,W}|parse_file(Epp)]; {eof,Location} -> [{eof,erl_anno:new(Location)}] end. @@ -752,6 +764,10 @@ scan_toks([{'-',_Lh},{atom,_Ld,define}=Define|Toks], From, St) -> scan_define(Toks, Define, From, St); scan_toks([{'-',_Lh},{atom,_Ld,undef}=Undef|Toks], From, St) -> scan_undef(Toks, Undef, From, St); +scan_toks([{'-',_Lh},{atom,_Ld,error}=Error|Toks], From, St) -> + scan_err_warn(Toks, Error, From, St); +scan_toks([{'-',_Lh},{atom,_Ld,warning}=Warn|Toks], From, St) -> + scan_err_warn(Toks, Warn, From, St); scan_toks([{'-',_Lh},{atom,_Li,include}=Inc|Toks], From, St) -> scan_include(Toks, Inc, From, St); scan_toks([{'-',_Lh},{atom,_Li,include_lib}=IncLib|Toks], From, St) -> @@ -807,6 +823,24 @@ scan_extends([{atom,Ln,A}=ModAtom,{')',_Lr}|_Ts], Ms0) -> Ms#{'BASE_MODULE_STRING':={none,[{string,Ln,ModString}]}}; scan_extends(_Ts, Ms) -> Ms. +scan_err_warn([{'(',_}|_]=Toks0, {atom,_,Tag}=Token, From, St) -> + try expand_macros(Toks0, St) of + Toks when is_list(Toks) -> + case erl_parse:parse_term(Toks) of + {ok,Term} -> + epp_reply(From, {Tag,{loc(Token),epp,{Tag,Term}}}); + {error,_} -> + epp_reply(From, {error,{loc(Token),epp,{bad,Tag}}}) + end + catch + _:_ -> + epp_reply(From, {error,{loc(Token),epp,{bad,Tag}}}) + end, + wait_req_scan(St); +scan_err_warn(_Toks, {atom,_,Tag}=Token, From, St) -> + epp_reply(From, {error,{loc(Token),epp,{bad,Tag}}}), + wait_req_scan(St). + %% scan_define(Tokens, DefineToken, From, EppState) scan_define([{'(',_Lp},{Type,_Lm,_}=Mac|Toks], Def, From, St) @@ -933,9 +967,15 @@ scan_include(_Toks, Inc, From, St) -> %% normal search path, if not we assume that the first directory name %% is a library name, find its true directory and try with that. -find_lib_dir(NewName) -> - [Lib | Rest] = filename:split(NewName), - {code:lib_dir(list_to_atom(Lib)), Rest}. +expand_lib_dir(Name) -> + try + [App|Path] = filename:split(Name), + LibDir = code:lib_dir(list_to_atom(App)), + {ok,fname_join([LibDir|Path])} + catch + _:_ -> + error + end. scan_include_lib([{'(',_Llp},{string,_Lf,_NewName0},{')',_Lrp},{dot,_Ld}], Inc, From, St) @@ -950,12 +990,11 @@ scan_include_lib([{'(',_Llp},{string,_Lf,NewName0},{')',_Lrp},{dot,_Ld}], {ok,NewF,Pname} -> wait_req_scan(enter_file2(NewF, Pname, From, St, Loc)); {error,_E1} -> - case catch find_lib_dir(NewName) of - {LibDir, Rest} when is_list(LibDir) -> - LibName = fname_join([LibDir | Rest]), - case file:open(LibName, [read]) of + case expand_lib_dir(NewName) of + {ok,Header} -> + case file:open(Header, [read]) of {ok,NewF} -> - wait_req_scan(enter_file2(NewF, LibName, From, + wait_req_scan(enter_file2(NewF, Header, From, St, Loc)); {error,_E2} -> epp_reply(From, @@ -963,7 +1002,7 @@ scan_include_lib([{'(',_Llp},{string,_Lf,NewName0},{')',_Lrp},{dot,_Ld}], {include,lib,NewName}}}), wait_req_scan(St) end; - _Error -> + error -> epp_reply(From, {error,{loc(Inc),epp, {include,lib,NewName}}}), wait_req_scan(St) diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl index f9e2e5f7d2..23bddafeed 100644 --- a/lib/stdlib/src/gen_statem.erl +++ b/lib/stdlib/src/gen_statem.erl @@ -97,7 +97,7 @@ %% * Postponing the current event is performed %% iff 'postpone' is 'true'. %% * A state timer is started iff 'timeout' is set. - %% * Pending events are processed or if there are + %% * Pending events are handled or if there are %% no pending events the server goes into receive %% or hibernate (iff 'hibernate' is 'true') %% @@ -282,16 +282,6 @@ event_type(Type) -> STACKTRACE(), try throw(ok) catch _ -> erlang:get_stacktrace() end). --define( - TERMINATE(Class, Reason, Debug, S, Q), - terminate( - begin Class end, - begin Reason end, - ?STACKTRACE(), - begin Debug end, - begin S end, - begin Q end)). - %%%========================================================================== %%% API @@ -300,11 +290,11 @@ event_type(Type) -> | {'via', RegMod :: module(), Name :: term()} | {'local', atom()}. -type server_ref() :: - {'global', GlobalName :: term()} - | {'via', RegMod :: module(), ViaName :: term()} + pid() | (LocalName :: atom()) | {Name :: atom(), Node :: atom()} - | pid(). + | {'global', GlobalName :: term()} + | {'via', RegMod :: module(), ViaName :: term()}. -type debug_opt() :: {'debug', Dbgs :: @@ -523,12 +513,15 @@ send(Proc, Msg) -> ok end. -%% Here init_it/6 and enter_loop/5,6,7 functions converge +%% Here the init_it/6 and enter_loop/5,6,7 functions converge enter(Module, Opts, CallbackMode, State, Data, Server, Actions, Parent) -> %% The values should already have been type checked Name = gen:get_proc_name(Server), Debug = gen:debug_options(Name, Opts), - PrevState = make_ref(), % Will be discarded by loop_event_actions/9 + P = Events = [], + Event = {internal,initial_state}, + %% We enforce {postpone,false} to ensure that + %% our fake Event gets discarded, thought it might get logged NewActions = if is_list(Actions) -> @@ -540,15 +533,17 @@ enter(Module, Opts, CallbackMode, State, Data, Server, Actions, Parent) -> callback_mode => CallbackMode, module => Module, name => Name, - state => PrevState, + %% All fields below will be replaced according to the arguments to + %% loop_event_actions/10 when it finally loops back to loop/3 + state => State, data => Data, - timer => undefined, - postponed => [], - hibernate => false}, + postponed => P, + hibernate => false, + timer => undefined}, + NewDebug = sys_debug(Debug, S, State, {enter,Event,State}), loop_event_actions( - Parent, Debug, S, [], - {event,undefined}, % Will be discarded thanks to {postpone,false} - PrevState, State, Data, NewActions). + Parent, NewDebug, S, Events, + State, Data, P, Event, State, NewActions). %%%========================================================================== %%% gen callbacks @@ -617,8 +612,12 @@ init_result(Starter, Parent, ServerRef, Module, Result, Opts) -> system_continue(Parent, Debug, S) -> loop(Parent, Debug, S). -system_terminate(Reason, _Parent, Debug, S) -> - ?TERMINATE(exit, Reason, Debug, S, []). +system_terminate( + Reason, _Parent, Debug, + #{state := State, data := Data, postponed := P} = S) -> + terminate( + exit, Reason, ?STACKTRACE(), + Debug, S, [], State, Data, P). system_code_change( #{module := Module, @@ -634,7 +633,10 @@ system_code_change( {NewCallbackMode,NewState,NewData} -> callback_mode(NewCallbackMode) orelse error({callback_mode,NewCallbackMode}), - {ok,S#{state := NewState, data := NewData}}; + {ok, + S#{callback_mode := NewCallbackMode, + state := NewState, + data := NewData}}; {ok,_} = Error -> error({case_clause,Error}); Error -> @@ -654,7 +656,7 @@ system_replace_state( format_status( Opt, [PDict,SysState,Parent,Debug, - #{name := Name, postponed := P} = S]) -> + #{name := Name, postponed := P, state := State, data := Data} = S]) -> Header = gen:format_status_header("Status for state machine", Name), Log = sys:get_debug(log, Debug, []), [{header,Header}, @@ -663,7 +665,7 @@ format_status( {"Parent",Parent}, {"Logged Events",Log}, {"Postponed",P}]} | - case format_status(Opt, PDict, S) of + case format_status(Opt, PDict, S, State, Data) of L when is_list(L) -> L; T -> [T] end]. @@ -673,21 +675,21 @@ format_status( %% them, not as the real erlang messages. Use trace for that. %%--------------------------------------------------------------------------- -print_event(Dev, {in,Event}, #{name := Name}) -> +print_event(Dev, {in,Event}, {Name,_}) -> io:format( Dev, "*DBG* ~p received ~s~n", [Name,event_string(Event)]); -print_event(Dev, {out,Reply,{To,_Tag}}, #{name := Name}) -> +print_event(Dev, {out,Reply,{To,_Tag}}, {Name,_}) -> io:format( Dev, "*DBG* ~p sent ~p to ~p~n", [Name,Reply,To]); -print_event(Dev, {Tag,Event,NewState}, #{name := Name, state := State}) -> +print_event(Dev, {Tag,Event,NextState}, {Name,State}) -> StateString = - case NewState of + case NextState of State -> io_lib:format("~p", [State]); _ -> - io_lib:format("~p => ~p", [State,NewState]) + io_lib:format("~p => ~p", [State,NextState]) end, io:format( Dev, "*DBG* ~p ~w ~s in state ~s~n", @@ -697,16 +699,17 @@ event_string(Event) -> case Event of {{call,{Pid,_Tag}},Request} -> io_lib:format("call ~p from ~w", [Request,Pid]); - {Tag,Content} -> - io_lib:format("~w ~p", [Tag,Content]) + {EventType,EventContent} -> + io_lib:format("~w ~p", [EventType,EventContent]) end. -sys_debug(Debug, S, Entry) -> +sys_debug(Debug, #{name := Name}, State, Entry) -> case Debug of [] -> Debug; _ -> - sys:handle_debug(Debug, fun print_event/3, S, Entry) + sys:handle_debug( + Debug, fun print_event/3, {Name,State}, Entry) end. %%%========================================================================== @@ -720,7 +723,7 @@ wakeup_from_hibernate(Parent, Debug, S) -> %%% State Machine engine implementation of proc_lib/gen server %% Server loop, consists of all loop* functions -%% and some detours through sys and proc_lib +%% and detours through sys:handle_system_message/7 and proc_lib:hibernate/3 %% Entry point for system_continue/3 loop(Parent, Debug, #{hibernate := Hibernate} = S) -> @@ -749,12 +752,16 @@ loop_receive(Parent, Debug, #{timer := Timer} = S) -> sys:handle_system_msg( Req, Pid, Parent, ?MODULE, Debug, S, Hibernate); {'EXIT',Parent,Reason} = EXIT -> + #{state := State, data := Data, postponed := P} = S, %% EXIT is not a 2-tuple and therefore %% not an event and has no event_type(), %% but this will stand out in the crash report... - ?TERMINATE(exit, Reason, Debug, S, [EXIT]); + terminate( + exit, Reason, ?STACKTRACE(), + Debug, S, [EXIT], State, Data, P); {timeout,Timer,Content} when Timer =/= undefined -> - loop_event(Parent, Debug, S, {timeout,Content}); + loop_receive_result( + Parent, Debug, S, {timeout,Content}); _ -> %% Cancel Timer if running case Timer of @@ -782,30 +789,81 @@ loop_receive(Parent, Debug, #{timer := Timer} = S) -> _ -> {info,Msg} end, - loop_event(Parent, Debug, S, Event) + loop_receive_result(Parent, Debug, S, Event) end end. -loop_event(Parent, Debug, S, Event) -> - %% The timer field and the hibernate flag in S - %% are now invalid and ignored until we get back to loop/3 - NewDebug = sys_debug(Debug, S, {in,Event}), - %% Here the queue of not yet processed events is created - loop_events(Parent, NewDebug, S, [Event], false). - -%% Process first the event queue, or if it is empty -%% loop back to receive a new event -loop_events(Parent, Debug, S, [], _Hibernate) -> - loop(Parent, Debug, S); +loop_receive_result( + Parent, Debug, + #{state := State, + data := Data, + postponed := P} = S, + Event) -> + %% The engine state map S is now dismantled + %% and will not be restored until we return to loop/3. + %% + %% The fields 'callback_mode', 'module', and 'name' are still valid. + %% The fields 'state', 'data', and 'postponed' are held in arguments. + %% The fields 'timer' and 'hibernate' will be recalculated. + %% + NewDebug = sys_debug(Debug, S, State, {in,Event}), + %% Here the queue of not yet handled events is created + Events = [], + Hibernate = false, + loop_event( + Parent, NewDebug, S, Events, State, Data, P, Event, Hibernate). + +%% Process the event queue, or if it is empty +%% loop back to loop/3 to receive a new event +loop_events( + Parent, Debug, S, [Event|Events], + State, Data, P, Hibernate, _Timeout) -> + %% + %% If there was a state timer requested we just ignore that + %% since we have events to handle which cancels the timer + loop_event( + Parent, Debug, S, Events, State, Data, P, Event, Hibernate); loop_events( + Parent, Debug, S, [], + State, Data, P, Hibernate, Timeout) -> + case Timeout of + {timeout,0,EventContent} -> + %% Immediate timeout - simulate it + %% so we do not get the timeout message + %% after any received event + loop_event( + Parent, Debug, S, [], + State, Data, P, {timeout,EventContent}, Hibernate); + {timeout,Time,EventContent} -> + %% Actually start a timer + Timer = erlang:start_timer(Time, self(), EventContent), + loop_events_done( + Parent, Debug, S, Timer, State, Data, P, Hibernate); + undefined -> + %% No state timeout has been requested + Timer = undefined, + loop_events_done( + Parent, Debug, S, Timer, State, Data, P, Hibernate) + end. +%% +loop_events_done(Parent, Debug, S, Timer, State, Data, P, Hibernate) -> + NewS = + S#{ + state := State, + data := Data, + postponed := P, + hibernate := Hibernate, + timer := Timer}, + loop(Parent, Debug, NewS). + +loop_event( Parent, Debug, #{callback_mode := CallbackMode, - module := Module, - state := State, - data := Data} = S, - [{Type,Content} = Event|Events] = Q, - Hibernate) -> - %% If the Hibernate flag is true here it can only be + module := Module} = S, + Events, + State, Data, P, {Type,Content} = Event, Hibernate) -> + %% + %% If Hibernate is true here it can only be %% because it was set from an event action %% and we did not go into hibernation since there %% were events in queue, so we do what the user @@ -813,6 +871,7 @@ loop_events( %% would have happened if we actually hibernated %% and immediately was awakened Hibernate andalso garbage_collect(), + %% try case CallbackMode of state_functions -> @@ -822,11 +881,11 @@ loop_events( end of Result -> loop_event_result( - Parent, Debug, S, Events, Event, Result) + Parent, Debug, S, Events, State, Data, P, Event, Result) catch Result -> loop_event_result( - Parent, Debug, S, Events, Event, Result); + Parent, Debug, S, Events, State, Data, P, Event, Result); error:badarg when CallbackMode =:= state_functions -> case erlang:get_stacktrace() of [{erlang,apply,[Module,State,_],_}|Stacktrace] -> @@ -835,9 +894,11 @@ loop_events( error, {undef_state_function,{Module,State,Args}}, Stacktrace, - Debug, S, Q); + Debug, S, [Event|Events], State, Data, P); Stacktrace -> - terminate(error, badarg, Stacktrace, Debug, S, Q) + terminate( + error, badarg, Stacktrace, + Debug, S, [Event|Events], State, Data, P) end; error:undef -> %% Process an undef to check for the simple mistake @@ -852,7 +913,7 @@ loop_events( error, {undef_state_function,{Module,State,Args}}, Stacktrace, - Debug, S, Q); + Debug, S, [Event|Events], State, Data, P); [{Module,handle_event, [Type,Content,State,Data]=Args, _} @@ -860,86 +921,85 @@ loop_events( when CallbackMode =:= handle_event_function -> terminate( error, - {undef_state_function, - {Module,handle_event,Args}}, + {undef_state_function,{Module,handle_event,Args}}, Stacktrace, - Debug, S, Q); + Debug, S, [Event|Events], State, Data, P); Stacktrace -> - terminate(error, undef, Stacktrace, Debug, S, Q) + terminate( + error, undef, Stacktrace, + Debug, S, [Event|Events], State, Data, P) end; Class:Reason -> Stacktrace = erlang:get_stacktrace(), - terminate(Class, Reason, Stacktrace, Debug, S, Q) + terminate( + Class, Reason, Stacktrace, + Debug, S, [Event|Events], State, Data, P) end. %% Interpret all callback return variants loop_event_result( - Parent, Debug, - #{state := State, data := Data} = S, - Events, Event, Result) -> - %% From now until we loop back to the loop_events/4 - %% the state and data fields in S are old + Parent, Debug, S, Events, State, Data, P, Event, Result) -> case Result of stop -> - ?TERMINATE(exit, normal, Debug, S, [Event|Events]); + terminate( + exit, normal, ?STACKTRACE(), + Debug, S, [Event|Events], State, Data, P); {stop,Reason} -> - ?TERMINATE(exit, Reason, Debug, S, [Event|Events]); + terminate( + exit, Reason, ?STACKTRACE(), + Debug, S, [Event|Events], State, Data, P); {stop,Reason,NewData} -> - NewS = S#{data := NewData}, - Q = [Event|Events], - ?TERMINATE(exit, Reason, Debug, NewS, Q); + terminate( + exit, Reason, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P); {stop_and_reply,Reason,Replies} -> Q = [Event|Events], - [Class,NewReason,Stacktrace,NewDebug] = - reply_then_terminate( - exit, Reason, ?STACKTRACE(), Debug, S, Q, Replies), - %% Since we got back here Replies was bad - terminate(Class, NewReason, Stacktrace, NewDebug, S, Q); + reply_then_terminate( + exit, Reason, ?STACKTRACE(), + Debug, S, Q, State, Data, P, Replies); {stop_and_reply,Reason,Replies,NewData} -> - NewS = S#{data := NewData}, Q = [Event|Events], - [Class,NewReason,Stacktrace,NewDebug] = - reply_then_terminate( - exit, Reason, ?STACKTRACE(), Debug, NewS, Q, Replies), - %% Since we got back here Replies was bad - terminate(Class, NewReason, Stacktrace, NewDebug, NewS, Q); + reply_then_terminate( + exit, Reason, ?STACKTRACE(), + Debug, S, Q, State, NewData, P, Replies); {next_state,NextState,NewData} -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, []); + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, []); {next_state,NextState,NewData,Actions} -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions); + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions); {keep_state,NewData} -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, State, NewData, []); + Parent, Debug, S, Events, + State, NewData, P, Event, State, []); {keep_state,NewData,Actions} -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, State, NewData, Actions); + Parent, Debug, S, Events, + State, NewData, P, Event, State, Actions); keep_state_and_data -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, State, Data, []); + Parent, Debug, S, Events, + State, Data, P, Event, State, []); {keep_state_and_data,Actions} -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, State, Data, Actions); + Parent, Debug, S, Events, + State, Data, P, Event, State, Actions); _ -> - ?TERMINATE( - error, {bad_return_value,Result}, Debug, S, [Event|Events]) + terminate( + error, {bad_return_value,Result}, ?STACKTRACE(), + Debug, S, [Event|Events], State, Data, P) end. loop_event_actions( - Parent, Debug, S, Events, Event, State, NextState, NewData, Actions) -> - Postpone = false, % Shall we postpone this event, true or false + Parent, Debug, S, Events, State, NewData, P, Event, NextState, Actions) -> + Postpone = false, % Shall we postpone this event; boolean() Hibernate = false, Timeout = undefined, NextEvents = [], loop_event_actions( - Parent, Debug, S, Events, Event, State, NextState, NewData, + Parent, Debug, S, Events, State, NewData, P, Event, NextState, if is_list(Actions) -> Actions; @@ -948,97 +1008,103 @@ loop_event_actions( end, Postpone, Hibernate, Timeout, NextEvents). %% -%% Process all action()s +%% Process all actions loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, [Action|Actions], + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, [Action|Actions], Postpone, Hibernate, Timeout, NextEvents) -> case Action of %% Actual actions {reply,From,Reply} -> case from(From) of true -> - NewDebug = do_reply(Debug, S, From, Reply), + NewDebug = do_reply(Debug, S, State, From, Reply), loop_event_actions( - Parent, NewDebug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, NewDebug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, Hibernate, Timeout, NextEvents); false -> - ?TERMINATE( - error, {bad_action,Action}, Debug, S, [Event|Events]) + terminate( + error, {bad_action,Action}, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P) end; {next_event,Type,Content} -> case event_type(Type) of true -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, Hibernate, Timeout, [{Type,Content}|NextEvents]); false -> - ?TERMINATE( - error, {bad_action,Action}, Debug, S, [Event|Events]) + terminate( + error, {bad_action,Action}, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P) end; %% Actions that set options {postpone,NewPostpone} when is_boolean(NewPostpone) -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, NewPostpone, Hibernate, Timeout, NextEvents); {postpone,_} -> - ?TERMINATE( - error, {bad_action,Action}, Debug, S, [Event|Events]); + terminate( + error, {bad_action,Action}, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P); postpone -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, true, Hibernate, Timeout, NextEvents); {hibernate,NewHibernate} when is_boolean(NewHibernate) -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, NewHibernate, Timeout, NextEvents); {hibernate,_} -> - ?TERMINATE( - error, {bad_action,Action}, Debug, S, [Event|Events]); + terminate( + error, {bad_action,Action}, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P); hibernate -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, true, Timeout, NextEvents); {timeout,infinity,_} -> % Clear timer - it will never trigger loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, Hibernate, undefined, NextEvents); {timeout,Time,_} = NewTimeout when is_integer(Time), Time >= 0 -> loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, Hibernate, NewTimeout, NextEvents); {timeout,_,_} -> - ?TERMINATE( - error, {bad_action,Action}, Debug, S, [Event|Events]); + terminate( + error, {bad_action,Action}, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P); infinity -> % Clear timer - it will never trigger loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, Hibernate, undefined, NextEvents); Time when is_integer(Time), Time >= 0 -> NewTimeout = {timeout,Time,Time}, loop_event_actions( - Parent, Debug, S, Events, Event, - State, NextState, NewData, Actions, + Parent, Debug, S, Events, + State, NewData, P, Event, NextState, Actions, Postpone, Hibernate, NewTimeout, NextEvents); _ -> - ?TERMINATE( - error, {bad_action,Action}, Debug, S, [Event|Events]) + terminate( + error, {bad_action,Action}, ?STACKTRACE(), + Debug, S, [Event|Events], State, NewData, P) end; %% %% End of actions list loop_event_actions( - Parent, Debug, #{postponed := P0} = S, Events, Event, - State, NextState, NewData, [], + Parent, Debug, S, Events, + State, NewData, P0, Event, NextState, [], Postpone, Hibernate, Timeout, NextEvents) -> %% %% All options have been collected and next_events are buffered. @@ -1059,89 +1125,62 @@ loop_event_actions( {lists:reverse(P1, Events),[]} end, %% Place next events first in queue - Q3 = lists:reverse(NextEvents, Q2), + Q = lists:reverse(NextEvents, Q2), %% NewDebug = sys_debug( - Debug, S, + Debug, S, State, case Postpone of true -> {postpone,Event,NextState}; false -> {consume,Event,NextState} end), - %% Have a peek on the event queue so we can avoid starting - %% the state timer unless we have to - {Q,Timer} = - case Timeout of - undefined -> - %% No state timeout has been requested - {Q3,undefined}; - {timeout,Time,EventContent} -> - %% A state timeout has been requested - case Q3 of - [] when Time =:= 0 -> - %% Immediate timeout - simulate it - %% so we do not get the timeout message - %% after any received event - {[{timeout,EventContent}],undefined}; - [] -> - %% Actually start a timer - {Q3,erlang:start_timer(Time, self(), EventContent)}; - _ -> - %% Do not start a timer since any queued - %% event cancels the state timer so we pretend - %% that the timer has been started and cancelled - {Q3,undefined} - end - end, - %% Loop to top of event queue loop; process next event loop_events( - Parent, NewDebug, - S#{ - state := NextState, - data := NewData, - timer := Timer, - postponed := P, - hibernate := Hibernate}, - Q, Hibernate). + Parent, NewDebug, S, Q, NextState, NewData, P, Hibernate, Timeout). %%--------------------------------------------------------------------------- %% Server helpers -reply_then_terminate(Class, Reason, Stacktrace, Debug, S, Q, Replies) -> +reply_then_terminate( + Class, Reason, Stacktrace, + Debug, S, Q, State, Data, P, Replies) -> if is_list(Replies) -> do_reply_then_terminate( - Class, Reason, Stacktrace, Debug, S, Q, Replies); + Class, Reason, Stacktrace, + Debug, S, Q, State, Data, P, Replies); true -> do_reply_then_terminate( - Class, Reason, Stacktrace, Debug, S, Q, [Replies]) + Class, Reason, Stacktrace, + Debug, S, Q, State, Data, P, [Replies]) end. %% -do_reply_then_terminate(Class, Reason, Stacktrace, Debug, S, Q, []) -> - terminate(Class, Reason, Stacktrace, Debug, S, Q); do_reply_then_terminate( - Class, Reason, Stacktrace, Debug, S, Q, [R|Rs]) -> + Class, Reason, Stacktrace, Debug, S, Q, State, Data, P, []) -> + terminate(Class, Reason, Stacktrace, Debug, S, Q, State, Data, P); +do_reply_then_terminate( + Class, Reason, Stacktrace, Debug, S, Q, State, Data, P, [R|Rs]) -> case R of {reply,{_To,_Tag}=From,Reply} -> - NewDebug = do_reply(Debug, S, From, Reply), + NewDebug = do_reply(Debug, S, State, From, Reply), do_reply_then_terminate( - Class, Reason, Stacktrace, NewDebug, S, Q, Rs); + Class, Reason, Stacktrace, + NewDebug, S, Q, State, Data, P, Rs); _ -> - [error,{bad_action,R},?STACKTRACE(),Debug] + terminate( + error, {bad_action,R}, ?STACKTRACE(), + Debug, S, Q, State, Data, P) end. -do_reply(Debug, S, From, Reply) -> +do_reply(Debug, S, State, From, Reply) -> reply(From, Reply), - sys_debug(Debug, S, {out,Reply,From}). + sys_debug(Debug, S, State, {out,Reply,From}). terminate( - Class, Reason, Stacktrace, Debug, - #{module := Module, - state := State, data := Data} = S, - Q) -> + Class, Reason, Stacktrace, + Debug, #{module := Module} = S, Q, State, Data, P) -> try Module:terminate(Reason, State, Data) of _ -> ok catch @@ -1149,8 +1188,8 @@ terminate( C:R -> ST = erlang:get_stacktrace(), error_info( - C, R, ST, Debug, S, Q, - format_status(terminate, get(), S)), + C, R, ST, Debug, S, Q, P, + format_status(terminate, get(), S, State, Data)), erlang:raise(C, R, ST) end, case Reason of @@ -1159,8 +1198,8 @@ terminate( {shutdown,_} -> ok; _ -> error_info( - Class, Reason, Stacktrace, Debug, S, Q, - format_status(terminate, get(), S)) + Class, Reason, Stacktrace, Debug, S, Q, P, + format_status(terminate, get(), S, State, Data)) end, case Stacktrace of [] -> @@ -1171,9 +1210,8 @@ terminate( error_info( Class, Reason, Stacktrace, Debug, - #{name := Name, callback_mode := CallbackMode, - state := State, postponed := P}, - Q, FmtData) -> + #{name := Name, callback_mode := CallbackMode}, + Q, P, FmtData) -> {FixedReason,FixedStacktrace} = case Stacktrace of [{M,F,Args,_}|ST] @@ -1202,46 +1240,49 @@ error_info( error_logger:format( "** State machine ~p terminating~n" ++ case Q of - [] -> - ""; - _ -> - "** Last event = ~p~n" + [] -> ""; + _ -> "** Last event = ~p~n" end ++ - "** When Server state = ~p~n" ++ + "** When server state = ~p~n" ++ "** Reason for termination = ~w:~p~n" ++ - "** State = ~p~n" ++ "** Callback mode = ~p~n" ++ - "** Queued/Postponed = ~w/~w~n" ++ + case Q of + [_,_|_] -> "** Queued = ~p~n"; + _ -> "" + end ++ + case P of + [] -> ""; + _ -> "** Postponed = ~p~n" + end ++ case FixedStacktrace of - [] -> - ""; - _ -> - "** Stacktrace =~n" - "** ~p~n" + [] -> ""; + _ -> "** Stacktrace =~n** ~p~n" end, [Name | case Q of - [] -> - []; - [Event|_] -> - [Event] + [] -> []; + [Event|_] -> [Event] end] ++ [FmtData,Class,FixedReason, - State,CallbackMode,length(Q),length(P)] ++ + CallbackMode] ++ + case Q of + [_|[_|_] = Events] -> [Events]; + _ -> [] + end ++ + case P of + [] -> []; + _ -> [P] + end ++ case FixedStacktrace of - [] -> - []; - _ -> - [FixedStacktrace] + [] -> []; + _ -> [FixedStacktrace] end), sys:print_log(Debug), ok. %% Call Module:format_status/2 or return a default value -format_status( - Opt, PDict, - #{module := Module, state := State, data := Data}) -> +format_status(Opt, PDict, #{module := Module}, State, Data) -> case erlang:function_exported(Module, format_status, 2) of true -> try Module:format_status(Opt, [PDict,State,Data]) diff --git a/lib/stdlib/test/epp_SUITE.erl b/lib/stdlib/test/epp_SUITE.erl index ef2c912c57..4078513e38 100644 --- a/lib/stdlib/test/epp_SUITE.erl +++ b/lib/stdlib/test/epp_SUITE.erl @@ -27,7 +27,8 @@ pmod/1, not_circular/1, skip_header/1, otp_6277/1, otp_7702/1, otp_8130/1, overload_mac/1, otp_8388/1, otp_8470/1, otp_8562/1, otp_8665/1, otp_8911/1, otp_10302/1, otp_10820/1, - otp_11728/1, encoding/1, extends/1, function_macro/1]). + otp_11728/1, encoding/1, extends/1, function_macro/1, + test_error/1, test_warning/1]). -export([epp_parse_erl_form/2]). @@ -67,7 +68,7 @@ all() -> not_circular, skip_header, otp_6277, otp_7702, otp_8130, overload_mac, otp_8388, otp_8470, otp_8562, otp_8665, otp_8911, otp_10302, otp_10820, otp_11728, - encoding, extends, function_macro]. + encoding, extends, function_macro, test_error, test_warning]. groups() -> [{upcase_mac, [], [upcase_mac_1, upcase_mac_2]}, @@ -1055,7 +1056,65 @@ ifdef(Config) -> ], [] = run(Config, Ts). +%% OTP-12847: Test the -error directive. +test_error(Config) -> + Cs = [{error_c1, + <<"-error(\"string and macro: \" ?MODULE_STRING).\n" + "-ifdef(NOT_DEFINED).\n" + " -error(\"this one will be skipped\").\n" + "-endif.\n">>, + {errors,[{1,epp,{error,"string and macro: epp_test"}}],[]}}, + + {error_c2, + <<"-ifdef(CONFIG_A).\n" + " t() -> a.\n" + "-else.\n" + "-ifdef(CONFIG_B).\n" + " t() -> b.\n" + "-else.\n" + "-error(\"Neither CONFIG_A nor CONFIG_B are available\").\n" + "-endif.\n" + "-endif.\n">>, + {errors,[{7,epp,{error,"Neither CONFIG_A nor CONFIG_B are available"}}],[]}}, + + {error_c3, + <<"-error(a b c).\n">>, + {errors,[{1,epp,{bad,error}}],[]}} + ], + + [] = compile(Config, Cs), + ok. + +%% OTP-12847: Test the -warning directive. +test_warning(Config) -> + Cs = [{warn_c1, + <<"-warning({a,term,?MODULE}).\n" + "-ifdef(NOT_DEFINED).\n" + "-warning(\"this one will be skipped\").\n" + "-endif.\n">>, + {warnings,[{1,epp,{warning,{a,term,epp_test}}}]}}, + + {warn_c2, + <<"-ifdef(CONFIG_A).\n" + " t() -> a.\n" + "-else.\n" + "-ifdef(CONFIG_B).\n" + " t() -> b.\n" + "-else.\n" + " t() -> c.\n" + "-warning(\"Using fallback\").\n" + "-endif.\n" + "-endif.\n">>, + {warnings,[{8,epp,{warning,"Using fallback"}}]}}, + + {warn_c3, + <<"-warning(a b c).\n">>, + {errors,[{1,epp,{bad,warning}}],[]}} + ], + + [] = compile(Config, Cs), + ok. %% Advanced test on overloading macros. overload_mac(Config) when is_list(Config) -> diff --git a/lib/stdlib/test/gen_statem_SUITE.erl b/lib/stdlib/test/gen_statem_SUITE.erl index 3deb5fd986..364314f91b 100644 --- a/lib/stdlib/test/gen_statem_SUITE.erl +++ b/lib/stdlib/test/gen_statem_SUITE.erl @@ -634,12 +634,14 @@ sys1(Config) -> stop_it(Pid). code_change(Config) -> + Mode = handle_event_function, {ok,Pid} = gen_statem:start(?MODULE, start_arg(Config, []), []), {idle,data} = sys:get_state(Pid), sys:suspend(Pid), - sys:change_code(Pid, ?MODULE, old_vsn, state_functions), + sys:change_code(Pid, ?MODULE, old_vsn, Mode), sys:resume(Pid), - {idle,{old_vsn,data,state_functions}} = sys:get_state(Pid), + {idle,{old_vsn,data,Mode}} = sys:get_state(Pid), + Mode = gen_statem:call(Pid, get_callback_mode), stop_it(Pid). call_format_status(Config) -> @@ -1478,6 +1480,8 @@ next_events(Type, Content, Data) -> end. +handle_common_events({call,From}, get_callback_mode, _, _) -> + {keep_state_and_data,{reply,From,state_functions}}; handle_common_events({call,From}, get, State, Data) -> {keep_state,Data, [{reply,From,{state,State,Data}}]}; @@ -1501,6 +1505,8 @@ handle_common_events(cast, {'alive?',Pid}, _, Data) -> handle_common_events(_, _, _, _) -> undefined. +handle_event({call,From}, get_callback_mode, _, _) -> + {keep_state_and_data,{reply,From,handle_event_function}}; %% Wrapper state machine that uses a map state machine spec handle_event( Type, Event, State, [Data|Machine]) diff --git a/lib/syntax_tools/src/erl_prettypr.erl b/lib/syntax_tools/src/erl_prettypr.erl index 81272e62de..119d375746 100644 --- a/lib/syntax_tools/src/erl_prettypr.erl +++ b/lib/syntax_tools/src/erl_prettypr.erl @@ -38,7 +38,7 @@ follow/3, empty/0]). -import(erl_parse, [preop_prec/1, inop_prec/1, func_prec/0, - max_prec/0]). + max_prec/0, type_inop_prec/1, type_preop_prec/1]). -define(PADDING, 2). -define(PAPER, 80). @@ -50,7 +50,8 @@ | fun((erl_syntax:syntaxTree(), _, _) -> prettypr:document()). -type clause_t() :: 'case_expr' | 'cond_expr' | 'fun_expr' | 'if_expr' | 'receive_expr' | 'try_expr' - | {'function', prettypr:document()}. + | {'function', prettypr:document()} + | 'spec'. -record(ctxt, {prec = 0 :: integer(), sub_indent = 2 :: non_neg_integer(), @@ -535,9 +536,6 @@ lay_2(Node, Ctxt) -> As = seq(erl_syntax:application_arguments(Node), floating(text(",")), reset_prec(Ctxt), fun lay/2), -%% D1 = beside(D, beside(text("("), -%% beside(par(As), -%% floating(text(")"))))), D1 = beside(D, beside(text("("), beside(par(As), floating(text(")"))))), @@ -651,7 +649,7 @@ lay_2(Node, Ctxt) -> beside(D1, beside(text(":"), D2)); %% - %% The rest is in alphabetical order + %% The rest is in alphabetical order (except map and types) %% arity_qualifier -> @@ -666,18 +664,67 @@ lay_2(Node, Ctxt) -> %% a period. If the arguments is `none', we only output the %% attribute name, without following parentheses. Ctxt1 = reset_prec(Ctxt), - N = erl_syntax:attribute_name(Node), - D = case erl_syntax:attribute_arguments(Node) of - none -> + Args = erl_syntax:attribute_arguments(Node), + N = erl_syntax:attribute_name(Node), + D = case attribute_type(Node) of + spec -> + [SpecTuple] = Args, + [FuncName, FuncTypes] = + erl_syntax:tuple_elements(SpecTuple), + Name = + case erl_syntax:type(FuncName) of + tuple -> + case erl_syntax:tuple_elements(FuncName) of + [F0, _] -> + F0; + [M0, F0, _] -> + erl_syntax:module_qualifier(M0, + F0); + _ -> + FuncName + end; + _ -> + FuncName + end, + Types = dodge_macros(FuncTypes), + D1 = lay_clauses(erl_syntax:concrete(Types), + spec, Ctxt1), + beside(follow(lay(N, Ctxt1), + lay(Name, Ctxt1), + Ctxt1#ctxt.break_indent), + D1); + type -> + [TypeTuple] = Args, + [Name, Type0, Elements] = + erl_syntax:tuple_elements(TypeTuple), + TypeName = dodge_macros(Name), + Type = dodge_macros(Type0), + As0 = dodge_macros(Elements), + As = erl_syntax:concrete(As0), + D1 = lay_type_application(TypeName, As, Ctxt1), + D2 = lay(erl_syntax:concrete(Type), Ctxt1), + beside(follow(lay(N, Ctxt1), + beside(D1, floating(text(" :: "))), + Ctxt1#ctxt.break_indent), + D2); + Tag when Tag =:= export_type; + Tag =:= optional_callbacks -> + [FuncNs] = Args, + FuncNames = erl_syntax:concrete(dodge_macros(FuncNs)), + As = unfold_function_names(FuncNames), + beside(lay(N, Ctxt1), + beside(text("("), + beside(lay(As, Ctxt1), + floating(text(")"))))); + _ when Args =:= none -> lay(N, Ctxt1); - Args -> - As = seq(Args, floating(text(",")), Ctxt1, - fun lay/2), + _ -> + D1 = par(seq(Args, floating(text(",")), Ctxt1, + fun lay/2)), beside(lay(N, Ctxt1), beside(text("("), - beside(par(As), - floating(text(")"))))) - end, + beside(D1, floating(text(")"))))) + end, beside(floating(text("-")), beside(D, floating(text(".")))); binary -> @@ -928,6 +975,16 @@ lay_2(Node, Ctxt) -> text -> text(erl_syntax:text_string(Node)); + typed_record_field -> + {_, Prec, _} = type_inop_prec('::'), + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:typed_record_field_body(Node), Ctxt1), + D2 = lay(erl_syntax:typed_record_field_type(Node), + set_prec(Ctxt, Prec)), + D3 = par([D1, floating(text(" ::")), D2], + Ctxt1#ctxt.break_indent), + maybe_parentheses(D3, Prec, Ctxt); + try_expr -> Ctxt1 = reset_prec(Ctxt), D1 = sep(seq(erl_syntax:try_expr_body(Node), @@ -965,9 +1022,236 @@ lay_2(Node, Ctxt) -> warning_marker -> E = erl_syntax:warning_marker_info(Node), beside(text("%% WARNING: "), - lay_error_info(E, reset_prec(Ctxt))) + lay_error_info(E, reset_prec(Ctxt))); + + %% + %% Types + %% + + annotated_type -> + {_, Prec, _} = type_inop_prec('::'), + D1 = lay(erl_syntax:annotated_type_name(Node), + reset_prec(Ctxt)), + D2 = lay(erl_syntax:annotated_type_body(Node), + set_prec(Ctxt, Prec)), + D3 = follow(beside(D1, floating(text(" ::"))), D2, + Ctxt#ctxt.break_indent), + maybe_parentheses(D3, Prec, Ctxt); + + type_application -> + Name = erl_syntax:type_application_name(Node), + Arguments = erl_syntax:type_application_arguments(Node), + %% Prefer shorthand notation. + case erl_syntax_lib:analyze_type_application(Node) of + {nil, 0} -> + text("[]"); + {list, 1} -> + [A] = Arguments, + D1 = lay(A, reset_prec(Ctxt)), + beside(text("["), beside(D1, text("]"))); + {nonempty_list, 1} -> + [A] = Arguments, + D1 = lay(A, reset_prec(Ctxt)), + beside(text("["), beside(D1, text(", ...]"))); + _ -> + lay_type_application(Name, Arguments, Ctxt) + end; + + bitstring_type -> + Ctxt1 = set_prec(Ctxt, max_prec()), + M = erl_syntax:bitstring_type_m(Node), + N = erl_syntax:bitstring_type_n(Node), + D1 = [beside(text("_:"), lay(M, Ctxt1)) || + (erl_syntax:type(M) =/= integer orelse + erl_syntax:integer_value(M) =/= 0)], + D2 = [beside(text("_:_*"), lay(N, Ctxt1)) || + (erl_syntax:type(N) =/= integer orelse + erl_syntax:integer_value(N) =/= 0)], + F = fun(D, _) -> D end, + D = seq(D1 ++ D2, floating(text(",")), Ctxt1, F), + beside(floating(text("<<")), + beside(par(D), floating(text(">>")))); + + fun_type -> + text("fun()"); + + constrained_function_type -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:constrained_function_type_body(Node), + Ctxt1), + D2 = lay(erl_syntax:constrained_function_type_argument(Node), + Ctxt1), + beside(D1, + beside(floating(text(" when ")), D2)); + + function_type -> + {Before, After} = case Ctxt#ctxt.clause of + spec -> + {"", ""}; + _ -> + {"fun(", ")"} + end, + Ctxt1 = reset_prec(Ctxt), + D1 = case erl_syntax:function_type_arguments(Node) of + any_arity -> + text("(...)"); + Arguments -> + As = seq(Arguments, + floating(text(",")), Ctxt1, + fun lay/2), + beside(text("("), + beside(par(As), + floating(text(")")))) + end, + D2 = lay(erl_syntax:function_type_return(Node), Ctxt1), + beside(floating(text(Before)), + beside(D1, + beside(floating(text(" -> ")), + beside(D2, floating(text(After)))))); + + constraint -> + Name = erl_syntax:constraint_argument(Node), + Args = erl_syntax:constraint_body(Node), + case is_subtype(Name, Args) of + true -> + [Var, Type] = Args, + {PrecL, Prec, PrecR} = type_inop_prec('::'), + D1 = lay(Var, set_prec(Ctxt, PrecL)), + D2 = lay(Type, set_prec(Ctxt, PrecR)), + D3 = follow(beside(D1, floating(text(" ::"))), D2, + Ctxt#ctxt.break_indent), + maybe_parentheses(D3, Prec, Ctxt); + false -> + lay_type_application(Name, Args, Ctxt) + end; + + map_type -> + case erl_syntax:map_type_fields(Node) of + any_size -> + text("map()"); + Fs -> + {Prec, _PrecR} = type_preop_prec('#'), + Es = lay_map_fields(Fs, + floating(text(",")), + reset_prec(Ctxt)), + D = beside(floating(text("#{")), + beside(par(Es), + floating(text("}")))), + maybe_parentheses(D, Prec, Ctxt) + end; + + map_type_assoc -> + Name = erl_syntax:map_type_assoc_name(Node), + Value = erl_syntax:map_type_assoc_value(Node), + lay_type_assoc(Name, Value, Ctxt); + + map_type_exact -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:map_type_exact_name(Node), Ctxt1), + D2 = lay(erl_syntax:map_type_exact_value(Node), Ctxt1), + par([D1, floating(text(":=")), D2], Ctxt1#ctxt.break_indent); + + integer_range_type -> + {PrecL, Prec, PrecR} = type_inop_prec('..'), + D1 = lay(erl_syntax:integer_range_type_low(Node), + set_prec(Ctxt, PrecL)), + D2 = lay(erl_syntax:integer_range_type_high(Node), + set_prec(Ctxt, PrecR)), + D3 = beside(D1, beside(text(".."), D2)), + maybe_parentheses(D3, Prec, Ctxt); + + record_type -> + {Prec, _PrecR} = type_preop_prec('#'), + D1 = beside(text("#"), + lay(erl_syntax:record_type_name(Node), + reset_prec(Ctxt))), + Es = seq(erl_syntax:record_type_fields(Node), + floating(text(",")), reset_prec(Ctxt), + fun lay/2), + D2 = beside(D1, + beside(text("{"), + beside(par(Es), + floating(text("}"))))), + maybe_parentheses(D2, Prec, Ctxt); + + record_type_field -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:record_type_field_name(Node), Ctxt1), + D2 = lay(erl_syntax:record_type_field_type(Node), Ctxt1), + par([D1, floating(text("::")), D2], Ctxt1#ctxt.break_indent); + + tuple_type -> + case erl_syntax:tuple_type_elements(Node) of + any_size -> + text("tuple()"); + Elements -> + Es = seq(Elements, + floating(text(",")), reset_prec(Ctxt), + fun lay/2), + beside(floating(text("{")), + beside(par(Es), floating(text("}")))) + end; + + type_union -> + {_, Prec, PrecR} = type_inop_prec('|'), + Es = par(seq(erl_syntax:type_union_types(Node), + floating(text(" |")), set_prec(Ctxt, PrecR), + fun lay/2)), + maybe_parentheses(Es, Prec, Ctxt); + + user_type_application -> + lay_type_application(erl_syntax:user_type_application_name(Node), + erl_syntax:user_type_application_arguments(Node), + Ctxt) + + end. + +attribute_type(Node) -> + N = erl_syntax:attribute_name(Node), + case catch erl_syntax:concrete(N) of + opaque -> + type; + spec -> + spec; + callback -> + spec; + type -> + type; + export_type -> + export_type; + optional_callbacks -> + optional_callbacks; + _ -> + N end. +is_subtype(Name, [Var, _]) -> + (erl_syntax:is_atom(Name, is_subtype) andalso + erl_syntax:type(Var) =:= variable); +is_subtype(_, _) -> false. + +unfold_function_names(Ns) -> + F = fun ({Atom, Arity}) -> + erl_syntax:arity_qualifier(erl_syntax:atom(Atom), + erl_syntax:integer(Arity)) + end, + erl_syntax:list([F(N) || N <- Ns]). + +%% Macros are not handled well. +dodge_macros(Type) -> + F = fun (T) -> + case erl_syntax:type(T) of + macro -> + Var = erl_syntax:macro_name(T), + VarName0 = erl_syntax:variable_name(Var), + VarName = list_to_atom("?"++atom_to_list(VarName0)), + Atom = erl_syntax:atom(VarName), + Atom; + _ -> T + end + end, + erl_syntax_lib:map(F, Type). + lay_parentheses(D, _Ctxt) -> beside(floating(text("(")), beside(D, floating(text(")")))). @@ -1020,6 +1304,8 @@ split_string_1([], _N, _L, As) -> split_string_2([$^, X | Xs], N, L, As) -> split_string_1(Xs, N - 2, L - 2, [X, $^ | As]); +split_string_2([$x, ${ | Xs], N, L, As) -> + split_string_3(Xs, N - 2, L - 2, [${, $x | As]); split_string_2([X1, X2, X3 | Xs], N, L, As) when X1 >= $0, X1 =< $7, X2 >= $0, X2 =< $7, X3 >= $0, X3 =< $7 -> split_string_1(Xs, N - 3, L - 3, [X3, X2, X1 | As]); @@ -1029,6 +1315,15 @@ split_string_2([X1, X2 | Xs], N, L, As) when split_string_2([X | Xs], N, L, As) -> split_string_1(Xs, N - 1, L - 1, [X | As]). +split_string_3([$} | Xs], N, L, As) -> + split_string_1(Xs, N - 1, L - 1, [$} | As]); +split_string_3([X | Xs], N, L, As) when + X >= $0, X =< $9; X >= $a, X =< $z; X >= $A, X =< $Z -> + split_string_3(Xs, N - 1, L -1, [X | As]); +split_string_3([X | Xs], N, L, As) when + X >= $0, X =< $9 -> + split_string_1(Xs, N - 1, L -1, [X | As]). + %% Note that there is nothing in `lay_clauses' that actually requires %% that the elements have type `clause'; it just sets up the proper %% context and arranges the elements suitably for clauses. @@ -1105,6 +1400,53 @@ lay_error_info(T, Ctxt) -> lay_concrete(T, Ctxt) -> lay(erl_syntax:abstract(T), Ctxt). +lay_map_fields([H | T], Separator, Ctxt) -> + case T of + [] -> + [case erl_syntax:type(H) of + map_type_assoc -> + lay_last_type_assoc(H, Ctxt); + _ -> + lay(H, Ctxt) + end]; + _ -> + [maybe_append(Separator, lay(H, Ctxt)) + | lay_map_fields(T, Separator, Ctxt)] + end; +lay_map_fields([], _, _) -> + [empty()]. + +lay_last_type_assoc(Node, Ctxt) -> + Name = erl_syntax:map_type_assoc_name(Node), + Value = erl_syntax:map_type_assoc_value(Node), + IsAny = fun({type,_,any,[]}) -> true; + %% ({var,_,'_'}) -> true; + (_) -> false + end, + case IsAny(Name) andalso IsAny(Value) of + true -> + text("..."); + false -> + lay_type_assoc(Name, Value, Ctxt) + end. + +lay_type_assoc(Name, Value, Ctxt) -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(Name, Ctxt1), + D2 = lay(Value, Ctxt1), + par([D1, floating(text("=>")), D2], Ctxt1#ctxt.break_indent). + +lay_type_application(Name, Arguments, Ctxt) -> + {PrecL, Prec} = func_prec(), % + D1 = lay(Name, set_prec(Ctxt, PrecL)), + As = seq(Arguments, + floating(text(",")), reset_prec(Ctxt), + fun lay/2), + D = beside(D1, beside(text("("), + beside(par(As), + floating(text(")"))))), + maybe_parentheses(D, Prec, Ctxt). + seq([H | T], Separator, Ctxt, Fun) -> case T of [] -> diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl index 97b5797b06..f4cda814fc 100644 --- a/lib/syntax_tools/src/erl_syntax.erl +++ b/lib/syntax_tools/src/erl_syntax.erl @@ -120,6 +120,9 @@ normalize_list/1, compact_list/1, + annotated_type/2, + annotated_type_name/1, + annotated_type_body/1, application/2, application/3, application_arguments/1, @@ -150,6 +153,9 @@ binary_generator/2, binary_generator_body/1, binary_generator_pattern/1, + bitstring_type/2, + bitstring_type_m/1, + bitstring_type_n/1, block_expr/1, block_expr_body/1, case_expr/2, @@ -175,6 +181,12 @@ cond_expr_clauses/1, conjunction/1, conjunction_body/1, + constrained_function_type/2, + constrained_function_type_body/1, + constrained_function_type_argument/1, + constraint/2, + constraint_argument/1, + constraint_body/1, disjunction/1, disjunction_body/1, eof_marker/0, @@ -188,10 +200,15 @@ fun_expr/1, fun_expr_arity/1, fun_expr_clauses/1, + fun_type/0, function/2, function_arity/1, function_clauses/1, function_name/1, + function_type/1, + function_type/2, + function_type_arguments/1, + function_type_return/1, generator/2, generator_body/1, generator_pattern/1, @@ -209,6 +226,9 @@ is_integer/2, integer_value/1, integer_literal/1, + integer_range_type/2, + integer_range_type_low/1, + integer_range_type_high/1, list/1, list/2, list_comp/2, @@ -230,6 +250,15 @@ map_field_exact/2, map_field_exact_name/1, map_field_exact_value/1, + map_type/0, + map_type/1, + map_type_fields/1, + map_type_assoc/2, + map_type_assoc_name/1, + map_type_assoc_value/1, + map_type_exact/2, + map_type_exact_name/1, + map_type_exact_value/1, match_expr/2, match_expr_body/1, match_expr_pattern/1, @@ -270,6 +299,12 @@ record_index_expr/2, record_index_expr_field/1, record_index_expr_type/1, + record_type/2, + record_type_name/1, + record_type_fields/1, + record_type_field/2, + record_type_field_name/1, + record_type_field_type/1, size_qualifier/2, size_qualifier_argument/1, size_qualifier_body/1, @@ -288,6 +323,18 @@ try_expr_clauses/1, try_expr_handlers/1, try_expr_after/1, + tuple_type/0, + tuple_type/1, + tuple_type_elements/1, + type_application/2, + type_application/3, + type_application_name/1, + type_application_arguments/1, + type_union/1, + type_union_types/1, + typed_record_field/2, + typed_record_field_body/1, + typed_record_field_type/1, class_qualifier/2, class_qualifier_argument/1, class_qualifier_body/1, @@ -295,6 +342,9 @@ tuple_elements/1, tuple_size/1, underscore/0, + user_type_application/2, + user_type_application_name/1, + user_type_application_arguments/1, variable/1, variable_name/1, variable_literal/1, @@ -412,23 +462,28 @@ %% <center><table border="1"> %% <tr> %% <td>application</td> +%% <td>annotated_type</td> %% <td>arity_qualifier</td> %% <td>atom</td> -%% <td>attribute</td> %% </tr><tr> +%% <td>attribute</td> %% <td>binary</td> %% <td>binary_field</td> +%% <td>bitstring_type</td> +%% </tr><tr> %% <td>block_expr</td> %% <td>case_expr</td> -%% </tr><tr> %% <td>catch_expr</td> %% <td>char</td> +%% </tr><tr> %% <td>class_qualifier</td> %% <td>clause</td> -%% </tr><tr> %% <td>comment</td> %% <td>cond_expr</td> +%% </tr><tr> %% <td>conjunction</td> +%% <td>constrained_function_type</td> +%% <td>constraint</td> %% <td>disjunction</td> %% </tr><tr> %% <td>eof_marker</td> @@ -437,43 +492,58 @@ %% <td>form_list</td> %% </tr><tr> %% <td>fun_expr</td> +%% <td>fun_type</td> %% <td>function</td> +%% <td>function_type</td> +%% </tr><tr> %% <td>generator</td> %% <td>if_expr</td> -%% </tr><tr> %% <td>implicit_fun</td> %% <td>infix_expr</td> +%% </tr><tr> %% <td>integer</td> +%% <td>integer_range_type</td> %% <td>list</td> -%% </tr><tr> %% <td>list_comp</td> +%% </tr><tr> %% <td>macro</td> %% <td>map_expr</td> %% <td>map_field_assoc</td> -%% </tr><tr> %% <td>map_field_exact</td> +%% </tr><tr> +%% <td>map_type</td> +%% <td>map_type_assoc</td> +%% <td>map_type_exact</td> %% <td>match_expr</td> %% <td>module_qualifier</td> -%% <td>named_fun_expr</td> %% </tr><tr> +%% <td>named_fun_expr</td> %% <td>nil</td> %% <td>operator</td> %% <td>parentheses</td> -%% <td>prefix_expr</td> %% </tr><tr> +%% <td>prefix_expr</td> %% <td>receive_expr</td> %% <td>record_access</td> %% <td>record_expr</td> -%% <td>record_field</td> %% </tr><tr> +%% <td>record_field</td> %% <td>record_index_expr</td> +%% <td>record_type</td> +%% <td>record_type_field</td> +%% </tr><tr> %% <td>size_qualifier</td> %% <td>string</td> %% <td>text</td> -%% </tr><tr> %% <td>try_expr</td> +%% </tr><tr> %% <td>tuple</td> +%% <td>tuple_type</td> +%% <td>typed_record_field</td> +%% <td>type_application</td> +%% <td>type_union</td> %% <td>underscore</td> +%% <td>user_type_application</td> %% <td>variable</td> %% </tr><tr> %% <td>warning_marker</td> @@ -487,12 +557,14 @@ %% always have the same name as the node type itself. %% %% @see tree/2 +%% @see annotated_type/2 %% @see application/3 %% @see arity_qualifier/2 %% @see atom/1 %% @see attribute/2 %% @see binary/1 %% @see binary_field/2 +%% @see bitstring_type/2 %% @see block_expr/1 %% @see case_expr/2 %% @see catch_expr/1 @@ -502,24 +574,34 @@ %% @see comment/2 %% @see cond_expr/1 %% @see conjunction/1 +%% @see constrained_function_type/2 +%% @see constraint/2 %% @see disjunction/1 %% @see eof_marker/0 %% @see error_marker/1 %% @see float/1 %% @see form_list/1 %% @see fun_expr/1 +%% @see fun_type/0 %% @see function/2 +%% @see function_type/1 +%% @see function_type/2 %% @see generator/2 %% @see if_expr/1 %% @see implicit_fun/2 %% @see infix_expr/3 %% @see integer/1 +%% @see integer_range_type/2 %% @see list/2 %% @see list_comp/2 %% @see macro/2 %% @see map_expr/2 %% @see map_field_assoc/2 %% @see map_field_exact/2 +%% @see map_type/0 +%% @see map_type/1 +%% @see map_type_assoc/2 +%% @see map_type_exact/2 %% @see match_expr/2 %% @see module_qualifier/2 %% @see named_fun_expr/2 @@ -532,12 +614,20 @@ %% @see record_expr/2 %% @see record_field/2 %% @see record_index_expr/2 +%% @see record_type/2 +%% @see record_type_field/2 %% @see size_qualifier/2 %% @see string/1 %% @see text/1 %% @see try_expr/3 %% @see tuple/1 +%% @see tuple_type/0 +%% @see tuple_type/1 +%% @see typed_record_field/2 +%% @see type_application/2 +%% @see type_union/1 %% @see underscore/0 +%% @see user_type_application/2 %% @see variable/1 %% @see warning_marker/1 @@ -602,6 +692,25 @@ type(Node) -> {remote, _, _, _} -> module_qualifier; {'try', _, _, _, _, _} -> try_expr; {tuple, _, _} -> tuple; + + %% Type types + {ann_type, _, _} -> annotated_type; + {remote_type, _, _} -> type_application; + {type, _, binary, [_, _]} -> bitstring_type; + {type, _, bounded_fun, [_, _]} -> constrained_function_type; + {type, _, constraint, [_, _]} -> constraint; + {type, _, 'fun', []} -> fun_type; + {type, _, 'fun', [_, _]} -> function_type; + {type, _, map, _} -> map_type; + {type, _, map_field_assoc, _} -> map_type_assoc; + {type, _, map_field_exact, _} -> map_type_exact; + {type, _, record, _} -> record_type; + {type, _, field_type, _} -> record_type_field; + {type, _, range, _} -> integer_range_type; + {type, _, tuple, _} -> tuple_type; + {type, _, union, _} -> type_union; + {type, _, _, _} -> type_application; + {user_type, _, _, _} -> user_type_application; _ -> erlang:error({badarg, Node}) end. @@ -621,6 +730,7 @@ type(Node) -> %% <td>`error_marker'</td> %% </tr><tr> %% <td>`float'</td> +%% <td>`fun_type'</td> %% <td>`integer'</td> %% <td>`nil'</td> %% <td>`operator'</td> @@ -633,7 +743,13 @@ type(Node) -> %% </tr> %% </table></center> %% +%% A node of type `map_expr' is a leaf node if and only if it has no +%% argument and no fields. +%% A node of type `map_type' is a leaf node if and only if it has no +%% fields (`any_size'). %% A node of type `tuple' is a leaf node if and only if its arity is zero. +%% A node of type `tuple_type' is a leaf node if and only if it has no +%% elements (`any_size'). %% %% Note: not all literals are leaf nodes, and vice versa. E.g., %% tuples with nonzero arity and nonempty lists may be literals, but are @@ -653,6 +769,7 @@ is_leaf(Node) -> eof_marker -> true; error_marker -> true; float -> true; + fun_type -> true; integer -> true; nil -> true; operator -> true; % nonstandard type @@ -661,7 +778,9 @@ is_leaf(Node) -> map_expr -> map_expr_fields(Node) =:= [] andalso map_expr_argument(Node) =:= none; + map_type -> map_type_fields(Node) =:= any_size; tuple -> tuple_elements(Node) =:= []; + tuple_type -> tuple_type_elements(Node) =:= any_size; underscore -> true; variable -> true; warning_marker -> true; @@ -3114,6 +3233,39 @@ attribute(Name) -> %% `Imports' is `{Module, [{A1, N1}, ..., {Ak, Nk}]}', or %% `-import(A1.....An).', if `Imports' is `[A1, ..., An]'. %% +%% {attribute, Pos, export_type, ExportedTypes} +%% +%% ExportedTypes = [{atom(), integer()}] +%% +%% Representing `-export_type([N1/A1, ..., Nk/Ak]).', +%% if `ExportedTypes' is `[{N1, A1}, ..., {Nk, Ak}]'. +%% +%% {attribute, Pos, optional_callbacks, OptionalCallbacks} +%% +%% OptionalCallbacks = [{atom(), integer()}] +%% +%% Representing `-optional_callbacks([A1/N1, ..., Ak/Nk]).', +%% if `OptionalCallbacks' is `[{A1, N1}, ..., {Ak, Nk}]'. +%% +%% {attribute, Pos, SpecTag, {FuncSpec, FuncType}} +%% +%% SpecTag = spec | callback +%% FuncSpec = {module(), atom(), arity()} | {atom(), arity()} +%% FuncType = a (possibly constrained) function type +%% +%% Representing `-SpecTag M:F/A Ft1; ...; Ftk.' or +%% `-SpecTag F/A Ft1; ...; Ftk.', if `FuncTypes' is +%% `[Ft1, ..., Ftk]'. +%% +%% {attribute, Pos, TypeTag, {Name, Type, Parameters}} +%% +%% TypeTag = type | opaque +%% Type = a type +%% Parameters = [Variable] +%% +%% Representing `-TypeTag Name(V1, ..., Vk) :: Type .' +%% if `Parameters' is `[V1, ..., Vk]'. +%% %% {attribute, Pos, file, Position} %% %% Position = {filename(), integer()} @@ -3125,13 +3277,19 @@ attribute(Name) -> %% %% Info = {Name, [Entries]} %% Name = atom() -%% Entries = {record_field, Pos, atom()} -%% | {record_field, Pos, atom(), erl_parse()} %% -%% Representing `-record(Name, {<F1>, ..., <Fn>}).', if `Info' is +%% Entries = UntypedEntries +%% | {typed_record_field, UntypedEntries, Type} +%% UntypedEntries = {record_field, Pos, atom()} +%% | {record_field, Pos, atom(), erl_parse()} +%% +%% Representing `-record(Name, {<F1>, ..., <Fn>}).', if `Info' is %% `{Name, [D1, ..., D1]}', where each `Fi' is either `Ai = <Ei>', %% if the corresponding `Di' is `{record_field, Pos, Ai, Ei}', or -%% otherwise simply `Ai', if `Di' is `{record_field, Pos, Ai}'. +%% otherwise simply `Ai', if `Di' is `{record_field, Pos, Ai}', or +%% `Ai = <Ei> :: <Ti>', if `Di' is `{typed_record_field, +%% {record_field, Pos, Ai, Ei}, Ti}', or `Ai :: <Ti>', if `Di' is +%% `{typed_record_field, {record_field, Pos, Ai}, Ti}'. %% %% {attribute, L, Name, Term} %% @@ -3309,11 +3467,6 @@ attribute_arguments(Node) -> [set_pos( list(unfold_function_names(Data, Pos)), Pos)]; - optional_callbacks -> - D = try list(unfold_function_names(Data, Pos)) - catch _:_ -> abstract(Data) - end, - [set_pos(D, Pos)]; import -> {Module, Imports} = Data, [set_pos(atom(Module), Pos), @@ -4183,7 +4336,8 @@ record_field(Name) -> %% type(Node) = record_field %% data(Node) = #record_field{name :: Name, value :: Value} %% -%% Name = Value = syntaxTree() +%% Name = syntaxTree() +%% Value = none | syntaxTree() -spec record_field(syntaxTree(), 'none' | syntaxTree()) -> syntaxTree(). @@ -4568,7 +4722,7 @@ application(Module, Name, Arguments) -> %% %% `erl_parse' representation: %% -%% {call, Pos, Fun, Args} +%% {call, Pos, Operator, Args} %% %% Operator = erl_parse() %% Arguments = [erl_parse()] @@ -4623,6 +4777,1095 @@ application_arguments(Node) -> (data(Node1))#application.arguments end. +%% ===================================================================== +%% @doc Creates an abstract annotated type expression. The result +%% represents "<code><em>Name</em> :: <em>Type</em></code>". +%% +%% @see annotated_type_name/1 +%% @see annotated_type_body/1 + +-record(annotated_type, {name :: syntaxTree(), body :: syntaxTree()}). + +%% type(Node) = annotated_type +%% data(Node) = #annotated_type{name :: Name, +%% body :: Type} +%% +%% Name = syntaxTree() +%% Type = syntaxTree() +%% +%% `erl_parse' representation: +%% +%% {ann_type, Pos, [Name, Type]} +%% +%% Name = erl_parse() +%% Type = erl_parse() + +-spec annotated_type(syntaxTree(), syntaxTree()) -> syntaxTree(). + +annotated_type(Name, Type) -> + tree(annotated_type, #annotated_type{name = Name, body = Type}). + +revert_annotated_type(Node) -> + Pos = get_pos(Node), + Name = annotated_type_name(Node), + Type = annotated_type_body(Node), + {ann_type, Pos, [Name, Type]}. + + +%% ===================================================================== +%% @doc Returns the name subtree of an `annotated_type' node. +%% +%% @see annotated_type/2 + +-spec annotated_type_name(syntaxTree()) -> syntaxTree(). + +annotated_type_name(Node) -> + case unwrap(Node) of + {ann_type, _, [Name, _]} -> + Name; + Node1 -> + (data(Node1))#annotated_type.name + end. + + +%% ===================================================================== +%% @doc Returns the type subtrees of an `annotated_type' node. +%% +%% @see annotated_type/2 + +-spec annotated_type_body(syntaxTree()) -> syntaxTree(). + +annotated_type_body(Node) -> + case unwrap(Node) of + {ann_type, _, [_, Type]} -> + Type; + Node1 -> + (data(Node1))#annotated_type.body + end. + + +%% ===================================================================== +%% @doc Creates an abstract fun of any type. The result represents +%% "<code>fun()</code>". + +%% type(Node) = fun_type +%% +%% `erl_parse' representation: +%% +%% {type, Pos, 'fun', []} + +-spec fun_type() -> syntaxTree(). + +fun_type() -> + tree(fun_type). + +revert_fun_type(Node) -> + Pos = get_pos(Node), + {type, Pos, 'fun', []}. + + +%% ===================================================================== +%% @doc Creates an abstract type application expression. If +%% `Module' is `none', this is call is equivalent +%% to `type_application(TypeName, Arguments)', otherwise it is +%% equivalent to `type_application(module_qualifier(Module, TypeName), +%% Arguments)'. +%% +%% (This is a utility function.) +%% +%% @see type_application/2 +%% @see module_qualifier/2 + +-spec type_application('none' | syntaxTree(), syntaxTree(), [syntaxTree()]) -> + syntaxTree(). + +type_application(none, TypeName, Arguments) -> + type_application(TypeName, Arguments); +type_application(Module, TypeName, Arguments) -> + type_application(module_qualifier(Module, TypeName), Arguments). + + +%% ===================================================================== +%% @doc Creates an abstract type application expression. If `Arguments' is +%% `[T1, ..., Tn]', the result represents +%% "<code><em>TypeName</em>(<em>T1</em>, ...<em>Tn</em>)</code>". +%% +%% @see user_type_application/2 +%% @see type_application/3 +%% @see type_application_name/1 +%% @see type_application_arguments/1 + +-record(type_application, {type_name :: syntaxTree(), + arguments :: [syntaxTree()]}). + +%% type(Node) = type_application +%% data(Node) = #type_application{type_name :: TypeName, +%% arguments :: Arguments} +%% +%% TypeName = syntaxTree() +%% Arguments = [syntaxTree()] +%% +%% `erl_parse' representation: +%% +%% {remote, Pos, [Module, Name, Arguments]} | +%% {type, Pos, Name, Arguments} +%% +%% Module = erl_parse() +%% Name = atom() +%% Arguments = [erl_parse()] + +-spec type_application(syntaxTree(), [syntaxTree()]) -> syntaxTree(). + +type_application(TypeName, Arguments) -> + tree(type_application, + #type_application{type_name = TypeName, arguments = Arguments}). + +revert_type_application(Node) -> + Pos = get_pos(Node), + TypeName = type_application_name(Node), + Arguments = type_application_arguments(Node), + case type(TypeName) of + module_qualifier -> + Module = module_qualifier_argument(TypeName), + Name = module_qualifier_body(TypeName), + {remote_type, Pos, [Module, Name, Arguments]}; + atom -> + {type, Pos, atom_value(TypeName), Arguments} + end. + + +%% ===================================================================== +%% @doc Returns the type name subtree of a `type_application' node. +%% +%% @see type_application/2 + +-spec type_application_name(syntaxTree()) -> syntaxTree(). + +type_application_name(Node) -> + case unwrap(Node) of + {remote_type, _, [Module, Name, _]} -> + module_qualifier(Module, Name); + {type, Pos, Name, _} -> + set_pos(atom(Name), Pos); + Node1 -> + (data(Node1))#type_application.type_name + end. + + +%% ===================================================================== +%% @doc Returns the arguments subtrees of a `type_application' node. +%% +%% @see type_application/2 + +-spec type_application_arguments(syntaxTree()) -> [syntaxTree()]. + +type_application_arguments(Node) -> + case unwrap(Node) of + {remote_type, _, [_, _, Arguments]} -> + Arguments; + {type, _, _, Arguments} -> + Arguments; + Node1 -> + (data(Node1))#type_application.arguments + end. + + +%% ===================================================================== +%% @doc Creates an abstract bitstring type. The result represents +%% "<code><em><<_:M, _:_*N>></em></code>". +%% +%% @see bitstring_type_m/1 +%% @see bitstring_type_n/1 + +-record(bitstring_type, {m :: syntaxTree(), n :: syntaxTree()}). + +%% type(Node) = bitstring_type +%% data(Node) = #bitstring_type{m :: M, n :: N} +%% +%% M = syntaxTree() +%% N = syntaxTree() +%% + +-spec bitstring_type(syntaxTree(), syntaxTree()) -> syntaxTree(). + +bitstring_type(M, N) -> + tree(bitstring_type, #bitstring_type{m = M, n =N}). + +revert_bitstring_type(Node) -> + Pos = get_pos(Node), + M = bitstring_type_m(Node), + N = bitstring_type_n(Node), + {type, Pos, binary, [M, N]}. + +%% ===================================================================== +%% @doc Returns the number of start bits, `M', of a `bitstring_type' node. +%% +%% @see bitstring_type/2 + +-spec bitstring_type_m(syntaxTree()) -> syntaxTree(). + +bitstring_type_m(Node) -> + case unwrap(Node) of + {type, _, binary, [M, _]} -> + M; + Node1 -> + (data(Node1))#bitstring_type.m + end. + +%% ===================================================================== +%% @doc Returns the segment size, `N', of a `bitstring_type' node. +%% +%% @see bitstring_type/2 + +-spec bitstring_type_n(syntaxTree()) -> syntaxTree(). + +bitstring_type_n(Node) -> + case unwrap(Node) of + {type, _, binary, [_, N]} -> + N; + Node1 -> + (data(Node1))#bitstring_type.n + end. + + +%% ===================================================================== +%% @doc Creates an abstract constrained function type. +%% If `FunctionConstraint' is `[C1, ..., Cn]', the result represents +%% "<code><em>FunctionType</em> when <em>C1</em>, ...<em>Cn</em></code>". +%% +%% @see constrained_function_type_body/1 +%% @see constrained_function_type_argument/1 + +-record(constrained_function_type, {body :: syntaxTree(), + argument :: syntaxTree()}). + +%% type(Node) = constrained_function_type +%% data(Node) = #constrained_function_type{body :: FunctionType, +%% argument :: FunctionConstraint} +%% +%% FunctionType = syntaxTree() +%% FunctionConstraint = syntaxTree() +%% +%% `erl_parse' representation: +%% +%% {type, Pos, bounded_fun, [FunctionType, FunctionConstraint]} +%% +%% FunctionType = erl_parse() +%% FunctionConstraint = [erl_parse()] + +-spec constrained_function_type(syntaxTree(), [syntaxTree()]) -> syntaxTree(). + +constrained_function_type(FunctionType, FunctionConstraint) -> + Conj = conjunction(FunctionConstraint), + tree(constrained_function_type, + #constrained_function_type{body = FunctionType, + argument = Conj}). + +revert_constrained_function_type(Node) -> + Pos = get_pos(Node), + FunctionType = constrained_function_type_body(Node), + FunctionConstraint = + conjunction_body(constrained_function_type_argument(Node)), + {type, Pos, bounded_fun, [FunctionType, FunctionConstraint]}. + + +%% ===================================================================== +%% @doc Returns the function type subtree of a +%% `constrained_function_type' node. +%% +%% @see constrained_function_type/2 + +-spec constrained_function_type_body(syntaxTree()) -> syntaxTree(). + +constrained_function_type_body(Node) -> + case unwrap(Node) of + {type, _, bounded_fun, [FunctionType, _]} -> + FunctionType; + Node1 -> + (data(Node1))#constrained_function_type.body + end. + +%% ===================================================================== +%% @doc Returns the function constraint subtree of a +%% `constrained_function_type' node. +%% +%% @see constrained_function_type/2 + +-spec constrained_function_type_argument(syntaxTree()) -> syntaxTree(). + +constrained_function_type_argument(Node) -> + case unwrap(Node) of + {type, _, bounded_fun, [_, FunctionConstraint]} -> + conjunction(FunctionConstraint); + Node1 -> + (data(Node1))#constrained_function_type.argument + end. + + +%% ===================================================================== +%% @equiv function_type(any_arity, Type) + +function_type(Type) -> + function_type(any_arity, Type). + +%% ===================================================================== +%% @doc Creates an abstract function type. If `Arguments' is +%% `[T1, ..., Tn]', then if it occurs within a function +%% specification, the result represents +%% "<code>(<em>T1</em>, ...<em>Tn</em>) -> <em>Return</em></code>"; otherwise +%% it represents +%% "<code>fun((<em>T1</em>, ...<em>Tn</em>) -> <em>Return</em>)</code>". +%% If `Arguments' is `any_arity', it represents +%% "<code>fun((...) -> <em>Return</em>)</code>". +%% +%% Note that the `erl_parse' representation is identical for +%% "<code><em>FunctionType</em></code>" and +%% "<code>fun(<em>FunctionType</em>)</code>". +%% +%% @see function_type_arguments/1 +%% @see function_type_return/1 + +-record(function_type, {arguments :: any_arity | [syntaxTree()], + return :: syntaxTree()}). + +%% type(Node) = function_type +%% data(Node) = #function_type{arguments :: any | Arguments, +%% return :: Type} +%% +%% Arguments = [syntaxTree()] +%% Type = syntaxTree() +%% +%% `erl_parse' representation: +%% +%% {type, Pos, 'fun', [{type, Pos, product, Arguments}, Type]} +%% {type, Pos, 'fun', [{type, Pos, any}, Type]} +%% +%% Arguments = [erl_parse()] +%% Type = erl_parse() + +-spec function_type('any_arity' | syntaxTree(), syntaxTree()) -> syntaxTree(). + +function_type(Arguments, Return) -> + tree(function_type, + #function_type{arguments = Arguments, return = Return}). + +revert_function_type(Node) -> + Pos = get_pos(Node), + Type = function_type_return(Node), + case function_type_arguments(Node) of + any_arity -> + {type, Pos, 'fun', [{type, Pos, any}, Type]}; + Arguments -> + {type, Pos, 'fun', [{type, Pos, product, Arguments}, Type]} + end. + + +%% ===================================================================== +%% @doc Returns the argument types subtrees of a `function_type' node. +%% If `Node' represents "<code>fun((...) -> <em>Return</em>)</code>", +%% `any_arity' is returned; otherwise, if `Node' represents +%% "<code>(<em>T1</em>, ...<em>Tn</em>) -> <em>Return</em></code>" or +%% "<code>fun((<em>T1</em>, ...<em>Tn</em>) -> <em>Return</em>)</code>", +%% `[T1, ..., Tn]' is returned. + +%% +%% @see function_type/1 +%% @see function_type/2 + +-spec function_type_arguments(syntaxTree()) -> any_arity | [syntaxTree()]. + +function_type_arguments(Node) -> + case unwrap(Node) of + {type, _, 'fun', [{type, _, any}, _]} -> + any_arity; + {type, _, 'fun', [{type, _, product, Arguments}, _]} -> + Arguments; + Node1 -> + (data(Node1))#function_type.arguments + end. + +%% ===================================================================== +%% @doc Returns the return type subtrees of a `function_type' node. +%% +%% @see function_type/1 +%% @see function_type/2 + +-spec function_type_return(syntaxTree()) -> syntaxTree(). + +function_type_return(Node) -> + case unwrap(Node) of + {type, _, 'fun', [_, Type]} -> + Type; + Node1 -> + (data(Node1))#function_type.return + end. + + +%% ===================================================================== +%% @doc Creates an abstract (subtype) constraint. The result represents +%% "<code><em>Name</em> :: <em>Type</em></code>". +%% +%% @see constraint_argument/1 +%% @see constraint_body/1 + +-record(constraint, {name :: syntaxTree(), + types :: [syntaxTree()]}). + +%% type(Node) = constraint +%% data(Node) = #constraint{name :: Name, +%% types :: [Type]} +%% +%% Name = syntaxTree() +%% Type = syntaxTree() +%% +%% `erl_parse' representation: +%% +%% {type, Pos, constraint, [Name, [Var, Type]]} +%% +%% Name = {atom, Pos, is_subtype} +%% Var = erl_parse() +%% Type = erl_parse() + +-spec constraint(syntaxTree(), [syntaxTree()]) -> syntaxTree(). + +constraint(Name, Types) -> + tree(constraint, + #constraint{name = Name, types = Types}). + +revert_constraint(Node) -> + Pos = get_pos(Node), + Name = constraint_argument(Node), + Types = constraint_body(Node), + {type, Pos, constraint, [Name, Types]}. + + +%% ===================================================================== +%% @doc Returns the name subtree of a `constraint' node. +%% +%% @see constraint/2 + +-spec constraint_argument(syntaxTree()) -> syntaxTree(). + +constraint_argument(Node) -> + case unwrap(Node) of + {type, _, constraint, [Name, _]} -> + Name; + Node1 -> + (data(Node1))#constraint.name + end. + +%% ===================================================================== +%% @doc Returns the type subtree of a `constraint' node. +%% +%% @see constraint/2 + +-spec constraint_body(syntaxTree()) -> [syntaxTree()]. + +constraint_body(Node) -> + case unwrap(Node) of + {type, _, constraint, [_, Types]} -> + Types; + Node1 -> + (data(Node1))#constraint.types + end. + + +%% ===================================================================== +%% @doc Creates an abstract map type assoc field. The result represents +%% "<code><em>Name</em> => <em>Value</em></code>". +%% +%% @see map_type_assoc_name/1 +%% @see map_type_assoc_value/1 +%% @see map_type/1 + +-record(map_type_assoc, {name :: syntaxTree(), value :: syntaxTree()}). + +%% `erl_parse' representation: +%% +%% {type, Pos, map_field_assoc, [Name, Value]} + +-spec map_type_assoc(syntaxTree(), syntaxTree()) -> syntaxTree(). + +map_type_assoc(Name, Value) -> + tree(map_type_assoc, #map_type_assoc{name = Name, value = Value}). + +revert_map_type_assoc(Node) -> + Pos = get_pos(Node), + Name = map_type_assoc_name(Node), + Value = map_type_assoc_value(Node), + {type, Pos, map_type_assoc, [Name, Value]}. + + +%% ===================================================================== +%% @doc Returns the name subtree of a `map_type_assoc' node. +%% +%% @see map_type_assoc/2 + +-spec map_type_assoc_name(syntaxTree()) -> syntaxTree(). + +map_type_assoc_name(Node) -> + case Node of + {type, _, map_field_assoc, [Name, _]} -> + Name; + _ -> + (data(Node))#map_type_assoc.name + end. + + +%% ===================================================================== +%% @doc Returns the value subtree of a `map_type_assoc' node. +%% +%% @see map_type_assoc/2 + +-spec map_type_assoc_value(syntaxTree()) -> syntaxTree(). + +map_type_assoc_value(Node) -> + case Node of + {type, _, map_field_assoc, [_, Value]} -> + Value; + _ -> + (data(Node))#map_type_assoc.value + end. + + +%% ===================================================================== +%% @doc Creates an abstract map type exact field. The result represents +%% "<code><em>Name</em> := <em>Value</em></code>". +%% +%% @see map_type_exact_name/1 +%% @see map_type_exact_value/1 +%% @see map_type/1 + +-record(map_type_exact, {name :: syntaxTree(), value :: syntaxTree()}). + +%% `erl_parse' representation: +%% +%% {type, Pos, map_field_exact, [Name, Value]} + +-spec map_type_exact(syntaxTree(), syntaxTree()) -> syntaxTree(). + +map_type_exact(Name, Value) -> + tree(map_type_exact, #map_type_exact{name = Name, value = Value}). + +revert_map_type_exact(Node) -> + Pos = get_pos(Node), + Name = map_type_exact_name(Node), + Value = map_type_exact_value(Node), + {type, Pos, map_type_exact, [Name, Value]}. + + +%% ===================================================================== +%% @doc Returns the name subtree of a `map_type_exact' node. +%% +%% @see map_type_exact/2 + +-spec map_type_exact_name(syntaxTree()) -> syntaxTree(). + +map_type_exact_name(Node) -> + case Node of + {type, _, map_field_exact, [Name, _]} -> + Name; + _ -> + (data(Node))#map_type_exact.name + end. + + +%% ===================================================================== +%% @doc Returns the value subtree of a `map_type_exact' node. +%% +%% @see map_type_exact/2 + +-spec map_type_exact_value(syntaxTree()) -> syntaxTree(). + +map_type_exact_value(Node) -> + case Node of + {type, _, map_field_exact, [_, Value]} -> + Value; + _ -> + (data(Node))#map_type_exact.value + end. + + +%% ===================================================================== +%% @equiv map_type(any_size) + +map_type() -> + map_type(any_size). + +%% ===================================================================== +%% @doc Creates an abstract type map. If `Fields' is +%% `[F1, ..., Fn]', the result represents +%% "<code>#{<em>F1</em>, ..., <em>Fn</em>}</code>"; +%% otherwise, if `Fields' is `any_size', it represents +%% "<code>map()</code>". +%% +%% @see map_type_fields/1 + +%% type(Node) = map_type +%% data(Node) = Fields +%% +%% Fields = any_size | [syntaxTree()] +%% +%% `erl_parse' representation: +%% +%% {type, Pos, map, [Field]} +%% {type, Pos, map, any} +%% +%% Field = erl_parse() + +-spec map_type('any_size' | [syntaxTree()]) -> syntaxTree(). + +map_type(Fields) -> + tree(map_type, Fields). + +revert_map_type(Node) -> + Pos = get_pos(Node), + {type, Pos, map, map_type_fields(Node)}. + + +%% ===================================================================== +%% @doc Returns the list of field subtrees of a `map_type' node. +%% If `Node' represents "<code>map()</code>", `any_size' is returned; +%% otherwise, if `Node' represents +%% "<code>#{<em>F1</em>, ..., <em>Fn</em>}</code>", +%% `[F1, ..., Fn]' is returned. +%% +%% @see map_type/0 +%% @see map_type/1 + +-spec map_type_fields(syntaxTree()) -> 'any_size' | [syntaxTree()]. + +map_type_fields(Node) -> + case unwrap(Node) of + {type, _, map, Fields} when is_list(Fields) -> + Fields; + {type, _, map, any} -> + any_size; + Node1 -> + data(Node1) + end. + + +%% ===================================================================== +%% @doc Creates an abstract range type. The result represents +%% "<code><em>Low</em> .. <em>High</em></code>". +%% +%% @see integer_range_type_low/1 +%% @see integer_range_type_high/1 + +-record(integer_range_type, {low :: syntaxTree(), + high :: syntaxTree()}). + +%% type(Node) = integer_range_type +%% data(Node) = #integer_range_type{low :: Low, high :: High} +%% +%% Low = syntaxTree() +%% High = syntaxTree() +%% +%% `erl_parse' representation: +%% +%% {type, Pos, range, [Low, High]} +%% +%% Low = erl_parse() +%% High = erl_parse() + +-spec integer_range_type(syntaxTree(), syntaxTree()) -> syntaxTree(). + +integer_range_type(Low, High) -> + tree(integer_range_type, #integer_range_type{low = Low, high = High}). + +revert_integer_range_type(Node) -> + Pos = get_pos(Node), + Low = integer_range_type_low(Node), + High = integer_range_type_high(Node), + {type, Pos, range, [Low, High]}. + + +%% ===================================================================== +%% @doc Returns the low limit of an `integer_range_type' node. +%% +%% @see integer_range_type/2 + +-spec integer_range_type_low(syntaxTree()) -> syntaxTree(). + +integer_range_type_low(Node) -> + case unwrap(Node) of + {type, _, range, [Low, _]} -> + Low; + Node1 -> + (data(Node1))#integer_range_type.low + end. + +%% ===================================================================== +%% @doc Returns the high limit of an `integer_range_type' node. +%% +%% @see integer_range_type/2 + +-spec integer_range_type_high(syntaxTree()) -> syntaxTree(). + +integer_range_type_high(Node) -> + case unwrap(Node) of + {type, _, range, [_, High]} -> + High; + Node1 -> + (data(Node1))#integer_range_type.high + end. + + +%% ===================================================================== +%% @doc Creates an abstract record type. If `Fields' is +%% `[F1, ..., Fn]', the result represents +%% "<code>#<em>Name</em>{<em>F1</em>, ..., <em>Fn</em>}</code>". +%% +%% @see record_type_name/1 +%% @see record_type_fields/1 + +-record(record_type, {name :: syntaxTree(), + fields :: [syntaxTree()]}). + +%% type(Node) = record_type +%% data(Node) = #record_type{name = Name, fields = Fields} +%% +%% Name = syntaxTree() +%% Fields = [syntaxTree()] +%% +%% `erl_parse' representation: +%% +%% {type, Pos, record, [Name|Fields]} +%% +%% Name = erl_parse() +%% Fields = [erl_parse()] + +-spec record_type(syntaxTree(), [syntaxTree()]) -> syntaxTree(). + +record_type(Name, Fields) -> + tree(record_type, #record_type{name = Name, fields = Fields}). + +revert_record_type(Node) -> + Pos = get_pos(Node), + Name = record_type_name(Node), + Fields = record_type_fields(Node), + {type, Pos, record, [Name | Fields]}. + + +%% ===================================================================== +%% @doc Returns the name subtree of a `record_type' node. +%% +%% @see record_type/2 + +-spec record_type_name(syntaxTree()) -> syntaxTree(). + +record_type_name(Node) -> + case unwrap(Node) of + {type, _, record, [Name|_]} -> + Name; + Node1 -> + (data(Node1))#record_type.name + end. + +%% ===================================================================== +%% @doc Returns the fields subtree of a `record_type' node. +%% +%% @see record_type/2 + +-spec record_type_fields(syntaxTree()) -> [syntaxTree()]. + +record_type_fields(Node) -> + case unwrap(Node) of + {type, _, record, [_|Fields]} -> + Fields; + Node1 -> + (data(Node1))#record_type.fields + end. + + +%% ===================================================================== +%% @doc Creates an abstract record type field. The result represents +%% "<code><em>Name</em> :: <em>Type</em></code>". +%% +%% @see record_type_field_name/1 +%% @see record_type_field_type/1 + +-record(record_type_field, {name :: syntaxTree(), + type :: syntaxTree()}). + +%% type(Node) = record_type_field +%% data(Node) = #record_type_field{name = Name, type = Type} +%% +%% Name = syntaxTree() +%% Type = syntaxTree() +%% +%% `erl_parse' representation: +%% +%% {type, Pos, field_type, [Name, Type]} +%% +%% Name = erl_parse() +%% Type = erl_parse() + +-spec record_type_field(syntaxTree(), syntaxTree()) -> syntaxTree(). + +record_type_field(Name, Type) -> + tree(record_type_field, #record_type_field{name = Name, type = Type}). + +revert_record_type_field(Node) -> + Pos = get_pos(Node), + Name = record_type_field_name(Node), + Type = record_type_field_type(Node), + {type, Pos, field_type, [Name, Type]}. + + +%% ===================================================================== +%% @doc Returns the name subtree of a `record_type_field' node. +%% +%% @see record_type_field/2 + +-spec record_type_field_name(syntaxTree()) -> syntaxTree(). + +record_type_field_name(Node) -> + case unwrap(Node) of + {type, _, field_type, [Name, _]} -> + Name; + Node1 -> + (data(Node1))#record_type_field.name + end. + +%% ===================================================================== +%% @doc Returns the type subtree of a `record_type_field' node. +%% +%% @see record_type_field/2 + +-spec record_type_field_type(syntaxTree()) -> syntaxTree(). + +record_type_field_type(Node) -> + case unwrap(Node) of + {type, _, field_type, [_, Type]} -> + Type; + Node1 -> + (data(Node1))#record_type_field.type + end. + + +%% ===================================================================== +%% @equiv tuple_type(any_size) + +tuple_type() -> + tuple_type(any_size). + +%% ===================================================================== +%% @doc Creates an abstract type tuple. If `Elements' is +%% `[T1, ..., Tn]', the result represents +%% "<code>{<em>T1</em>, ..., <em>Tn</em>}</code>"; +%% otherwise, if `Elements' is `any_size', it represents +%% "<code>tuple()</code>". +%% +%% @see tuple_type_elements/1 + +%% type(Node) = tuple_type +%% data(Node) = Elements +%% +%% Elements = any_size | [syntaxTree()] +%% +%% `erl_parse' representation: +%% +%% {type, Pos, tuple, [Element]} +%% {type, Pos, tuple, any} +%% +%% Element = erl_parse() + +-spec tuple_type(any_size | [syntaxTree()]) -> syntaxTree(). + +tuple_type(Elements) -> + tree(tuple_type, Elements). + +revert_tuple_type(Node) -> + Pos = get_pos(Node), + {type, Pos, tuple, tuple_type_elements(Node)}. + + +%% ===================================================================== +%% @doc Returns the list of type element subtrees of a `tuple_type' node. +%% If `Node' represents "<code>tuple()</code>", `any_size' is returned; +%% otherwise, if `Node' represents +%% "<code>{<em>T1</em>, ..., <em>Tn</em>}</code>", +%% `[T1, ..., Tn]' is returned. +%% +%% @see tuple_type/0 +%% @see tuple_type/1 + +-spec tuple_type_elements(syntaxTree()) -> 'any_size' | [syntaxTree()]. + +tuple_type_elements(Node) -> + case unwrap(Node) of + {type, _, tuple, Elements} when is_list(Elements) -> + Elements; + {type, _, tuple, any} -> + any_size; + Node1 -> + data(Node1) + end. + + +%% ===================================================================== +%% @doc Creates an abstract type union. If `Types' is +%% `[T1, ..., Tn]', the result represents +%% "<code><em>T1</em> | ... | <em>Tn</em></code>". +%% +%% @see type_union_types/1 + +%% type(Node) = type_union +%% data(Node) = Types +%% +%% Types = [syntaxTree()] +%% +%% `erl_parse' representation: +%% +%% {type, Pos, union, Elements} +%% +%% Elements = [erl_parse()] + +-spec type_union([syntaxTree()]) -> syntaxTree(). + +type_union(Types) -> + tree(type_union, Types). + +revert_type_union(Node) -> + Pos = get_pos(Node), + {type, Pos, union, type_union_types(Node)}. + + +%% ===================================================================== +%% @doc Returns the list of type subtrees of a `type_union' node. +%% +%% @see type_union/1 + +-spec type_union_types(syntaxTree()) -> [syntaxTree()]. + +type_union_types(Node) -> + case unwrap(Node) of + {type, _, union, Types} when is_list(Types) -> + Types; + Node1 -> + data(Node1) + end. + + +%% ===================================================================== +%% @doc Creates an abstract user type. If `Arguments' is +%% `[T1, ..., Tn]', the result represents +%% "<code><em>TypeName</em>(<em>T1</em>, ...<em>Tn</em>)</code>". +%% +%% @see type_application/2 +%% @see user_type_application_name/1 +%% @see user_type_application_arguments/1 + +-record(user_type_application, {type_name :: syntaxTree(), + arguments :: [syntaxTree()]}). + +%% type(Node) = user_type_application +%% data(Node) = #user_type_application{type_name :: TypeName, +%% arguments :: Arguments} +%% +%% TypeName = syntaxTree() +%% Arguments = [syntaxTree()] +%% +%% `erl_parse' representation: +%% +%% {user_type, Pos, Name, Arguments} +%% +%% Name = erl_parse() +%% Arguments = [Type] +%% Type = erl_parse() + +-spec user_type_application(syntaxTree(), [syntaxTree()]) -> syntaxTree(). + +user_type_application(TypeName, Arguments) -> + tree(user_type_application, + #user_type_application{type_name = TypeName, arguments = Arguments}). + +revert_user_type_application(Node) -> + Pos = get_pos(Node), + TypeName = user_type_application_name(Node), + Arguments = user_type_application_arguments(Node), + {user_type, Pos, atom_value(TypeName), Arguments}. + + +%% ===================================================================== +%% @doc Returns the type name subtree of a `user_type_application' node. +%% +%% @see user_type_application/2 + +-spec user_type_application_name(syntaxTree()) -> syntaxTree(). + +user_type_application_name(Node) -> + case unwrap(Node) of + {user_type, Pos, Name, _} -> + set_pos(atom(Name), Pos); + Node1 -> + (data(Node1))#user_type_application.type_name + end. + + +%% ===================================================================== +%% @doc Returns the arguments subtrees of a `user_type_application' node. +%% +%% @see user_type_application/2 + +-spec user_type_application_arguments(syntaxTree()) -> [syntaxTree()]. + +user_type_application_arguments(Node) -> + case unwrap(Node) of + {user_type, _, _, Arguments} -> + Arguments; + Node1 -> + (data(Node1))#user_type_application.arguments + end. + + +%% ===================================================================== +%% @doc Creates an abstract typed record field specification. The +%% result represents "<code><em>Field</em> :: <em>Type</em></code>". +%% +%% @see typed_record_field_body/1 +%% @see typed_record_field_type/1 + +-record(typed_record_field, {body :: syntaxTree(), + type :: syntaxTree()}). + +%% type(Node) = typed_record_field +%% data(Node) = #typed_record_field{body :: Field +%% type = Type} +%% +%% Field = syntaxTree() +%% Type = syntaxTree() + +-spec typed_record_field(syntaxTree(), syntaxTree()) -> syntaxTree(). + +typed_record_field(Field, Type) -> + tree(typed_record_field, + #typed_record_field{body = Field, type = Type}). + + +%% ===================================================================== +%% @doc Returns the field subtree of a `typed_record_field' node. +%% +%% @see typed_record_field/2 + +-spec typed_record_field_body(syntaxTree()) -> syntaxTree(). + +typed_record_field_body(Node) -> + (data(Node))#typed_record_field.body. + + +%% ===================================================================== +%% @doc Returns the type subtree of a `typed_record_field' node. +%% +%% @see typed_record_field/2 + +-spec typed_record_field_type(syntaxTree()) -> syntaxTree(). + +typed_record_field_type(Node) -> + (data(Node))#typed_record_field.type. + %% ===================================================================== %% @doc Creates an abstract list comprehension. If `Body' is @@ -6168,6 +7411,8 @@ revert(Node) -> revert_root(Node) -> case type(Node) of + annotated_type -> + revert_annotated_type(Node); application -> revert_application(Node); atom -> @@ -6182,6 +7427,8 @@ revert_root(Node) -> revert_binary_field(Node); binary_generator -> revert_binary_generator(Node); + bitstring_type -> + revert_bitstring_type(Node); block_expr -> revert_block_expr(Node); case_expr -> @@ -6194,6 +7441,10 @@ revert_root(Node) -> revert_clause(Node); cond_expr -> revert_cond_expr(Node); + constrained_function_type -> + revert_constrained_function_type(Node); + constraint -> + revert_constraint(Node); eof_marker -> revert_eof_marker(Node); error_marker -> @@ -6202,8 +7453,12 @@ revert_root(Node) -> revert_float(Node); fun_expr -> revert_fun_expr(Node); + fun_type -> + revert_fun_type(Node); function -> revert_function(Node); + function_type -> + revert_function_type(Node); generator -> revert_generator(Node); if_expr -> @@ -6214,6 +7469,8 @@ revert_root(Node) -> revert_infix_expr(Node); integer -> revert_integer(Node); + integer_range_type -> + revert_integer_range_type(Node); list -> revert_list(Node); list_comp -> @@ -6224,6 +7481,12 @@ revert_root(Node) -> revert_map_field_assoc(Node); map_field_exact -> revert_map_field_exact(Node); + map_type -> + revert_map_type(Node); + map_type_assoc -> + revert_map_type_assoc(Node); + map_type_exact -> + revert_map_type_exact(Node); match_expr -> revert_match_expr(Node); module_qualifier -> @@ -6244,14 +7507,26 @@ revert_root(Node) -> revert_record_expr(Node); record_index_expr -> revert_record_index_expr(Node); + record_type -> + revert_record_type(Node); + record_type_field -> + revert_record_type_field(Node); + type_application -> + revert_type_application(Node); + type_union -> + revert_type_union(Node); string -> revert_string(Node); try_expr -> revert_try_expr(Node); tuple -> revert_tuple(Node); + tuple_type -> + revert_tuple_type(Node); underscore -> revert_underscore(Node); + user_type_application -> + revert_user_type_application(Node); variable -> revert_variable(Node); warning_marker -> @@ -6379,6 +7654,9 @@ subtrees(T) -> []; false -> case type(T) of + annotated_type -> + [[annotated_type_name(T)], + [annotated_type_body(T)]]; application -> [[application_operator(T)], application_arguments(T)]; @@ -6407,6 +7685,9 @@ subtrees(T) -> binary_generator -> [[binary_generator_pattern(T)], [binary_generator_body(T)]]; + bitstring_type -> + [[bitstring_type_m(T)], + [bitstring_type_n(T)]]; block_expr -> [block_expr_body(T)]; case_expr -> @@ -6429,14 +7710,30 @@ subtrees(T) -> [cond_expr_clauses(T)]; conjunction -> [conjunction_body(T)]; + constrained_function_type -> + C = constrained_function_type_argument(T), + [[constrained_function_type_body(T)], + conjunction_body(C)]; + constraint -> + [[constraint_argument(T)], + constraint_body(T)]; disjunction -> [disjunction_body(T)]; form_list -> [form_list_elements(T)]; fun_expr -> [fun_expr_clauses(T)]; + fun_type -> + []; function -> [[function_name(T)], function_clauses(T)]; + function_type -> + case function_type_arguments(T) of + any_arity -> + [[function_type_return(T)]]; + As -> + [As,[function_type_return(T)]] + end; generator -> [[generator_pattern(T)], [generator_body(T)]]; if_expr -> @@ -6447,6 +7744,9 @@ subtrees(T) -> [[infix_expr_left(T)], [infix_expr_operator(T)], [infix_expr_right(T)]]; + integer_range_type -> + [[integer_range_type_low(T)], + [integer_range_type_high(T)]]; list -> case list_suffix(T) of none -> @@ -6476,6 +7776,14 @@ subtrees(T) -> map_field_exact -> [[map_field_exact_name(T)], [map_field_exact_value(T)]]; + map_type -> + [map_type_fields(T)]; + map_type_assoc -> + [[map_type_assoc_name(T)], + [map_type_assoc_value(T)]]; + map_type_exact -> + [[map_type_exact_name(T)], + [map_type_exact_value(T)]]; match_expr -> [[match_expr_pattern(T)], [match_expr_body(T)]]; @@ -6523,6 +7831,12 @@ subtrees(T) -> record_index_expr -> [[record_index_expr_type(T)], [record_index_expr_field(T)]]; + record_type -> + [[record_type_name(T)], + record_type_fields(T)]; + record_type_field -> + [[record_type_field_name(T)], + [record_type_field_type(T)]]; size_qualifier -> [[size_qualifier_body(T)], [size_qualifier_argument(T)]]; @@ -6532,7 +7846,20 @@ subtrees(T) -> try_expr_handlers(T), try_expr_after(T)]; tuple -> - [tuple_elements(T)] + [tuple_elements(T)]; + tuple_type -> + [tuple_type_elements(T)]; + type_application -> + [[type_application_name(T)], + type_application_arguments(T)]; + type_union -> + [type_union_types(T)]; + typed_record_field -> + [[typed_record_field_body(T)], + [typed_record_field_type(T)]]; + user_type_application -> + [[user_type_application_name(T)], + user_type_application_arguments(T)] end end. @@ -6576,6 +7903,7 @@ update_tree(Node, Groups) -> -spec make_tree(atom(), [[syntaxTree()]]) -> syntaxTree(). +make_tree(annotated_type, [[N], [T]]) -> annotated_type(N, T); make_tree(application, [[F], A]) -> application(F, A); make_tree(arity_qualifier, [[N], [A]]) -> arity_qualifier(N, A); make_tree(attribute, [[N]]) -> attribute(N); @@ -6585,6 +7913,7 @@ make_tree(binary_comp, [[T], B]) -> binary_comp(T, B); make_tree(binary_field, [[B]]) -> binary_field(B); make_tree(binary_field, [[B], Ts]) -> binary_field(B, Ts); make_tree(binary_generator, [[P], [E]]) -> binary_generator(P, E); +make_tree(bitstring_type, [[M], [N]]) -> bitstring_type(M, N); make_tree(block_expr, [B]) -> block_expr(B); make_tree(case_expr, [[A], C]) -> case_expr(A, C); make_tree(catch_expr, [[B]]) -> catch_expr(B); @@ -6593,14 +7922,20 @@ make_tree(clause, [P, B]) -> clause(P, none, B); make_tree(clause, [P, [G], B]) -> clause(P, G, B); make_tree(cond_expr, [C]) -> cond_expr(C); make_tree(conjunction, [E]) -> conjunction(E); +make_tree(constrained_function_type, [[F],C]) -> + constrained_function_type(F, C); +make_tree(constraint, [[N], Ts]) -> constraint(N, Ts); make_tree(disjunction, [E]) -> disjunction(E); make_tree(form_list, [E]) -> form_list(E); make_tree(fun_expr, [C]) -> fun_expr(C); make_tree(function, [[N], C]) -> function(N, C); +make_tree(function_type, [[T]]) -> function_type(T); +make_tree(function_type, [A,[T]]) -> function_type(A, T); make_tree(generator, [[P], [E]]) -> generator(P, E); make_tree(if_expr, [C]) -> if_expr(C); make_tree(implicit_fun, [[N]]) -> implicit_fun(N); make_tree(infix_expr, [[L], [F], [R]]) -> infix_expr(L, F, R); +make_tree(integer_range_type, [[L],[H]]) -> integer_range_type(L, H); make_tree(list, [P]) -> list(P); make_tree(list, [P, [S]]) -> list(P, S); make_tree(list_comp, [[T], B]) -> list_comp(T, B); @@ -6610,6 +7945,9 @@ make_tree(map_expr, [Fs]) -> map_expr(Fs); make_tree(map_expr, [[E], Fs]) -> map_expr(E, Fs); make_tree(map_field_assoc, [[K], [V]]) -> map_field_assoc(K, V); make_tree(map_field_exact, [[K], [V]]) -> map_field_exact(K, V); +make_tree(map_type, [Fs]) -> map_type(Fs); +make_tree(map_type_assoc, [[N],[V]]) -> map_type_assoc(N, V); +make_tree(map_type_exact, [[N],[V]]) -> map_type_exact(N, V); make_tree(match_expr, [[P], [E]]) -> match_expr(P, E); make_tree(named_fun_expr, [[N], C]) -> named_fun_expr(N, C); make_tree(module_qualifier, [[M], [N]]) -> module_qualifier(M, N); @@ -6625,9 +7963,16 @@ make_tree(record_field, [[N]]) -> record_field(N); make_tree(record_field, [[N], [E]]) -> record_field(N, E); make_tree(record_index_expr, [[T], [F]]) -> record_index_expr(T, F); +make_tree(record_type, [[N],Fs]) -> record_type(N, Fs); +make_tree(record_type_field, [[N],[T]]) -> record_type_field(N, T); make_tree(size_qualifier, [[N], [A]]) -> size_qualifier(N, A); make_tree(try_expr, [B, C, H, A]) -> try_expr(B, C, H, A); -make_tree(tuple, [E]) -> tuple(E). +make_tree(tuple, [E]) -> tuple(E); +make_tree(tuple_type, [Es]) -> tuple_type(Es); +make_tree(type_application, [[N], Ts]) -> type_application(N, Ts); +make_tree(type_union, [Es]) -> type_union(Es); +make_tree(typed_record_field, [[F],[T]]) -> typed_record_field(F, T); +make_tree(user_type_application, [[N], Ts]) -> user_type_application(N, Ts). %% ===================================================================== @@ -6954,6 +8299,7 @@ fold_variable_names(Vs) -> unfold_variable_names(Vs, Pos) -> [set_pos(variable(V), Pos) || V <- Vs]. + %% Support functions for transforming lists of record field definitions. %% %% There is no unique representation for field definitions in the @@ -6968,6 +8314,16 @@ fold_record_fields(Fs) -> [fold_record_field(F) || F <- Fs]. fold_record_field(F) -> + case type(F) of + typed_record_field -> + Field = fold_record_field_1(typed_record_field_body(F)), + Type = typed_record_field_type(F), + {typed_record_field, Field, Type}; + record_field -> + fold_record_field_1(F) + end. + +fold_record_field_1(F) -> Pos = get_pos(F), Name = record_field_name(F), case record_field_value(F) of @@ -6980,10 +8336,11 @@ fold_record_field(F) -> unfold_record_fields(Fs) -> [unfold_record_field(F) || F <- Fs]. -unfold_record_field({typed_record_field, Field, _Type}) -> - unfold_record_field_1(Field); +unfold_record_field({typed_record_field, Field, Type}) -> + F = unfold_record_field_1(Field), + set_pos(typed_record_field(F, Type), get_pos(F)); unfold_record_field(Field) -> - unfold_record_field_1(Field). + unfold_record_field_1(Field). unfold_record_field_1({record_field, Pos, Name}) -> set_pos(record_field(Name), Pos); @@ -7010,5 +8367,4 @@ unfold_binary_field_type({Type, Size}, Pos) -> unfold_binary_field_type(Type, Pos) -> set_pos(atom(Type), Pos). - %% ===================================================================== diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl index 58c4cc5244..9815559779 100644 --- a/lib/syntax_tools/src/erl_syntax_lib.erl +++ b/lib/syntax_tools/src/erl_syntax_lib.erl @@ -36,6 +36,7 @@ analyze_import_attribute/1, analyze_module_attribute/1, analyze_record_attribute/1, analyze_record_expr/1, analyze_record_field/1, analyze_wild_attribute/1, annotate_bindings/1, + analyze_type_application/1, analyze_type_name/1, annotate_bindings/2, fold/3, fold_subtrees/3, foldl_listlist/3, function_name_expansions/1, is_fail_expr/1, limit/2, limit/3, map/2, map_subtrees/2, mapfold/3, mapfold_subtrees/3, @@ -1029,14 +1030,17 @@ is_fail_expr(E) -> %% <dt>`{records, Records}'</dt> %% <dd><ul> %% <li>`Records = [{atom(), Fields}]'</li> -%% <li>`Fields = [{atom(), Default}]'</li> +%% <li>`Fields = [{atom(), {Default, Type}}]'</li> %% <li>`Default = none | syntaxTree()'</li> +%% <li>`Type = none | syntaxTree()'</li> %% </ul> %% `Records' is a list of pairs representing the names %% and corresponding field declarations of all record declaration %% attributes occurring in `Forms'. For fields declared %% without a default value, the corresponding value for -%% `Default' is the atom `none' (cf. +%% `Default' is the atom `none'. Similarly, for fields declared +%% without a type, the corresponding value for `Type' is the +%% atom `none' (cf. %% `analyze_record_attribute/1'). We do not guarantee %% that each record name occurs at most once in the list. The %% order of listing is not defined.</dd> @@ -1055,9 +1059,9 @@ is_fail_expr(E) -> %% %% @see analyze_wild_attribute/1 %% @see analyze_export_attribute/1 +%% @see analyze_function/1 %% @see analyze_import_attribute/1 %% @see analyze_record_attribute/1 -%% @see analyze_function/1 %% @see erl_syntax:error_marker_info/1 %% @see erl_syntax:warning_marker_info/1 @@ -1102,8 +1106,6 @@ collect_attribute(file, _, Info) -> Info; collect_attribute(record, {R, L}, Info) -> finfo_add_record(R, L, Info); -collect_attribute(spec, _, Info) -> - Info; collect_attribute(_, {N, V}, Info) -> finfo_add_attribute(N, V, Info). @@ -1114,12 +1116,15 @@ collect_attribute(_, {N, V}, Info) -> module_imports = [] :: [atom()], imports = [] :: [{atom(), [{atom(), arity()}]}], attributes = [] :: [{atom(), term()}], - records = [] :: [{atom(), [{atom(), field_default()}]}], + records = [] :: [{atom(), [{atom(), + field_default(), + field_type()}]}], errors = [] :: [term()], warnings = [] :: [term()], functions = [] :: [{atom(), arity()}]}). -type field_default() :: 'none' | erl_syntax:syntaxTree(). +-type field_type() :: 'none' | erl_syntax:syntaxTree(). new_finfo() -> #forms{}. @@ -1326,8 +1331,6 @@ analyze_attribute(file, Node) -> analyze_file_attribute(Node); analyze_attribute(record, Node) -> analyze_record_attribute(Node); -analyze_attribute(spec, _Node) -> - spec; analyze_attribute(_, Node) -> %% A "wild" attribute (such as e.g. a `compile' directive). analyze_wild_attribute(Node). @@ -1523,6 +1526,55 @@ analyze_import_attribute(Node) -> %% ===================================================================== +%% @spec analyze_type_name(Node::syntaxTree()) -> TypeName +%% +%% TypeName = atom() +%% | {atom(), integer()} +%% | {ModuleName, {atom(), integer()}} +%% ModuleName = atom() +%% +%% @doc Returns the type name represented by a syntax tree. If +%% `Node' represents a type name, such as +%% "`foo/1'" or "`bloggs:fred/2'", a uniform +%% representation of that name is returned. +%% +%% The evaluation throws `syntax_error' if +%% `Node' does not represent a well-formed type name. + +-spec analyze_type_name(erl_syntax:syntaxTree()) -> typeName(). + +analyze_type_name(Node) -> + case erl_syntax:type(Node) of + atom -> + erl_syntax:atom_value(Node); + arity_qualifier -> + A = erl_syntax:arity_qualifier_argument(Node), + N = erl_syntax:arity_qualifier_body(Node), + + case ((erl_syntax:type(A) =:= integer) + and (erl_syntax:type(N) =:= atom)) + of + true -> + append_arity(erl_syntax:integer_value(A), + erl_syntax:atom_value(N)); + _ -> + throw(syntax_error) + end; + module_qualifier -> + M = erl_syntax:module_qualifier_argument(Node), + case erl_syntax:type(M) of + atom -> + N = erl_syntax:module_qualifier_body(Node), + N1 = analyze_type_name(N), + {erl_syntax:atom_value(M), N1}; + _ -> + throw(syntax_error) + end; + _ -> + throw(syntax_error) + end. + +%% ===================================================================== %% @spec analyze_wild_attribute(Node::syntaxTree()) -> {atom(), term()} %% %% @doc Returns the name and value of a "wild" attribute. The result is @@ -1547,6 +1599,7 @@ analyze_wild_attribute(Node) -> atom -> case erl_syntax:attribute_arguments(Node) of [V] -> + %% Note: does not work well with macros. case catch {ok, erl_syntax:concrete(V)} of {ok, Val} -> {erl_syntax:atom_value(N), Val}; @@ -1568,17 +1621,22 @@ analyze_wild_attribute(Node) -> %% @spec analyze_record_attribute(Node::syntaxTree()) -> %% {atom(), Fields} %% -%% Fields = [{atom(), none | syntaxTree()}] +%% Fields = [{atom(), {Default, Type}}] +%% Default = none | syntaxTree() +%% Type = none | syntaxTree() %% %% @doc Returns the name and the list of fields of a record declaration %% attribute. The result is a pair `{Name, Fields}', if %% `Node' represents "`-record(Name, {...}).'", %% where `Fields' is a list of pairs `{Label, -%% Default}' for each field "`Label'" or "`Label = -%% <em>Default</em>'" in the declaration, listed in left-to-right +%% {Default, Type}}' for each field "`Label'", "`Label = +%% <em>Default</em>'", "`Label :: <em>Type</em>'", or +%% "`Label = <em>Default</em> :: <em>Type</em>'" in the declaration, +%% listed in left-to-right %% order. If the field has no default-value declaration, the value for -%% `Default' will be the atom `none'. We do not -%% guarantee that each label occurs at most one in the list. +%% `Default' will be the atom `none'. If the field has no type declaration, +%% the value for `Type' will be the atom `none'. We do not +%% guarantee that each label occurs at most once in the list. %% %% The evaluation throws `syntax_error' if %% `Node' does not represent a well-formed record declaration @@ -1587,7 +1645,9 @@ analyze_wild_attribute(Node) -> %% @see analyze_attribute/1 %% @see analyze_record_field/1 --type fields() :: [{atom(), 'none' | erl_syntax:syntaxTree()}]. +-type field() :: {atom(), {field_default(), field_type()}}. + +-type fields() :: [field()]. -spec analyze_record_attribute(erl_syntax:syntaxTree()) -> {atom(), fields()}. @@ -1625,7 +1685,7 @@ analyze_record_attribute_tuple(Node) -> %% {atom(), Info} | atom() %% %% Info = {atom(), [{atom(), Value}]} | {atom(), atom()} | atom() -%% Value = none | syntaxTree() +%% Value = syntaxTree() %% %% @doc Returns the record name and field name/names of a record %% expression. If `Node' has type `record_expr', @@ -1645,9 +1705,9 @@ analyze_record_attribute_tuple(Node) -> %% %% For a `record_expr' node, `Info' represents %% the record name and the list of descriptors for the involved fields, -%% listed in the order they appear. (See -%% `analyze_record_field/1' for details on the field -%% descriptors). For a `record_access' node, +%% listed in the order they appear. A field descriptor is a pair +%% `{Label, Value}', if `Node' represents "`Label = <em>Value</em>'". +%% For a `record_access' node, %% `Info' represents the record name and the field name. For a %% `record_index_expr' node, `Info' represents the %% record name and the name field name. @@ -1659,7 +1719,7 @@ analyze_record_attribute_tuple(Node) -> %% @see analyze_record_attribute/1 %% @see analyze_record_field/1 --type info() :: {atom(), [{atom(), 'none' | erl_syntax:syntaxTree()}]} +-type info() :: {atom(), [{atom(), erl_syntax:syntaxTree()}]} | {atom(), atom()} | atom(). -spec analyze_record_expr(erl_syntax:syntaxTree()) -> {atom(), info()} | atom(). @@ -1670,8 +1730,9 @@ analyze_record_expr(Node) -> A = erl_syntax:record_expr_type(Node), case erl_syntax:type(A) of atom -> - Fs = [analyze_record_field(F) - || F <- erl_syntax:record_expr_fields(Node)], + Fs0 = [analyze_record_field(F) + || F <- erl_syntax:record_expr_fields(Node)], + Fs = [{N, D} || {N, {D, _T}} <- Fs0], {record_expr, {erl_syntax:atom_value(A), Fs}}; _ -> throw(syntax_error) @@ -1713,16 +1774,19 @@ analyze_record_expr(Node) -> end. %% ===================================================================== -%% @spec analyze_record_field(Node::syntaxTree()) -> {atom(), Value} +%% @spec analyze_record_field(Node::syntaxTree()) -> {atom(), {Default, Type}} %% -%% Value = none | syntaxTree() +%% Default = none | syntaxTree() +%% Type = none | syntaxTree() %% -%% @doc Returns the label and value-expression of a record field -%% specifier. The result is a pair `{Label, Value}', if -%% `Node' represents "`Label = <em>Value</em>'" or -%% "`Label'", where in the first case, `Value' is -%% a syntax tree, and in the second case `Value' is -%% `none'. +%% @doc Returns the label, value-expression, and type of a record field +%% specifier. The result is a pair `{Label, {Default, Type}}', if +%% `Node' represents "`Label'", "`Label = <em>Default</em>'", +%% "`Label :: <em>Type</em>'", or +%% "`Label = <em>Default</em> :: <em>Type</em>'". +%% If the field has no value-expression, the value for +%% `Default' will be the atom `none'. If the field has no type, +%% the value for `Type' will be the atom `none'. %% %% The evaluation throws `syntax_error' if %% `Node' does not represent a well-formed record field @@ -1731,8 +1795,7 @@ analyze_record_expr(Node) -> %% @see analyze_record_attribute/1 %% @see analyze_record_expr/1 --spec analyze_record_field(erl_syntax:syntaxTree()) -> - {atom(), 'none' | erl_syntax:syntaxTree()}. +-spec analyze_record_field(erl_syntax:syntaxTree()) -> field(). analyze_record_field(Node) -> case erl_syntax:type(Node) of @@ -1741,10 +1804,15 @@ analyze_record_field(Node) -> case erl_syntax:type(A) of atom -> T = erl_syntax:record_field_value(Node), - {erl_syntax:atom_value(A), T}; + {erl_syntax:atom_value(A), {T, none}}; _ -> throw(syntax_error) end; + typed_record_field -> + F = erl_syntax:typed_record_field_body(Node), + {N, {V, _none}} = analyze_record_field(F), + T = erl_syntax:typed_record_field_type(Node), + {N, {V, T}}; _ -> throw(syntax_error) end. @@ -1887,6 +1955,55 @@ analyze_application(Node) -> %% ===================================================================== +%% @spec analyze_type_application(Node::syntaxTree()) -> typeName() +%% +%% TypeName = {atom(), integer()} +%% | {ModuleName, {atom(), integer()}} +%% ModuleName = atom() +%% +%% @doc Returns the name of a used type. The result is a +%% representation of the name of the used pre-defined or local type `N/A', +%% if `Node' represents a local (user) type application +%% "`<em>N</em>(<em>T_1</em>, ..., <em>T_A</em>)'", or +%% a representation of the name of the used remote type `M:N/A' +%% if `Node' represents a remote user type application +%% "`<em>M</em>:<em>N</em>(<em>T_1</em>, ..., <em>T_A</em>)'". +%% +%% The evaluation throws `syntax_error' if `Node' does not represent a +%% well-formed (user) type application expression. +%% +%% @see analyze_type_name/1 + +-type typeName() :: atom() | {module(), atom(), arity()} | {atom(), arity()}. + +-spec analyze_type_application(erl_syntax:syntaxTree()) -> typeName(). + +analyze_type_application(Node) -> + case erl_syntax:type(Node) of + type_application -> + A = length(erl_syntax:type_application_arguments(Node)), + N = erl_syntax:type_application_name(Node), + case catch {ok, analyze_type_name(N)} of + {ok, TypeName} -> + append_arity(A, TypeName); + _ -> + throw(syntax_error) + end; + user_type_application -> + A = length(erl_syntax:user_type_application_arguments(Node)), + N = erl_syntax:user_type_application_name(Node), + case catch {ok, analyze_type_name(N)} of + {ok, TypeName} -> + append_arity(A, TypeName); + _ -> + throw(syntax_error) + end; + _ -> + throw(syntax_error) + end. + + +%% ===================================================================== %% @spec function_name_expansions(Names::[Name]) -> [{ShortName, Name}] %% %% Name = ShortName | {atom(), Name} diff --git a/lib/syntax_tools/src/igor.erl b/lib/syntax_tools/src/igor.erl index 4557678f9d..1d14bd7c3a 100644 --- a/lib/syntax_tools/src/igor.erl +++ b/lib/syntax_tools/src/igor.erl @@ -2612,6 +2612,19 @@ get_module_info(Forms) -> fold_record_fields(Rs) -> [{N, [fold_record_field(F) || F <- Fs]} || {N, Fs} <- Rs]. +fold_record_field({_Name, {none, _Type}} = None) -> + None; +fold_record_field({Name, {F, Type}}) -> + case erl_syntax:is_literal(F) of + true -> + {Name, {value, erl_syntax:concrete(F)}, Type}; + false -> + %% The default value for the field is not a constant, so we + %% represent it by a hash value instead. (We don't want to + %% do this in the general case.) + {Name, {hash, erlang:phash(F, 16#ffffff)}, Type} + end; +%% The following two clauses handle code before Erlang/OTP 19.0. fold_record_field({_Name, none} = None) -> None; fold_record_field({Name, F}) -> diff --git a/lib/syntax_tools/src/syntax_tools.app.src b/lib/syntax_tools/src/syntax_tools.app.src index dd4ac46055..5c6008a5f0 100644 --- a/lib/syntax_tools/src/syntax_tools.app.src +++ b/lib/syntax_tools/src/syntax_tools.app.src @@ -18,4 +18,4 @@ {applications, [stdlib]}, {env, []}, {runtime_dependencies, - ["compiler-6.0","erts-6.0","kernel-3.0","stdlib-2.5"]}]}. + ["compiler-7.0","erts-8.0","kernel-5.0","stdlib-3.0"]}]}. diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl index eb52cce6af..b935d42bb7 100644 --- a/lib/syntax_tools/test/syntax_tools_SUITE.erl +++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl @@ -61,7 +61,7 @@ appup_test(Config) when is_list(Config) -> smoke_test(Config) when is_list(Config) -> Dog = ?t:timetrap(?t:minutes(12)), Wc = filename:join([code:lib_dir(),"*","src","*.erl"]), - Fs = filelib:wildcard(Wc), + Fs = filelib:wildcard(Wc) ++ test_files(Config), io:format("~p files\n", [length(Fs)]), case p_run(fun smoke_test_file/1, Fs) of 0 -> ok; @@ -93,7 +93,7 @@ print_error_markers(F, File) -> revert(Config) when is_list(Config) -> Dog = ?t:timetrap(?t:minutes(12)), Wc = filename:join([code:lib_dir("stdlib"),"src","*.erl"]), - Fs = filelib:wildcard(Wc), + Fs = filelib:wildcard(Wc) ++ test_files(Config), Path = [filename:join(code:lib_dir(stdlib), "include"), filename:join(code:lib_dir(kernel), "include")], io:format("~p files\n", [length(Fs)]), @@ -203,18 +203,25 @@ t_erl_parse_type(Config) when is_list(Config) -> t_epp_dodger(Config) when is_list(Config) -> DataDir = ?config(data_dir, Config), PrivDir = ?config(priv_dir, Config), - Filenames = ["syntax_tools_SUITE_test_module.erl", - "syntax_tools_test.erl"], + Filenames = test_files(), ok = test_epp_dodger(Filenames,DataDir,PrivDir), ok. t_comment_scan(Config) when is_list(Config) -> DataDir = ?config(data_dir, Config), - Filenames = ["syntax_tools_SUITE_test_module.erl", - "syntax_tools_test.erl"], + Filenames = test_files(), ok = test_comment_scan(Filenames,DataDir), ok. +test_files(Config) -> + DataDir = ?config(data_dir, Config), + [ filename:join(DataDir,Filename) || Filename <- test_files() ]. + +test_files() -> + ["syntax_tools_SUITE_test_module.erl", + "syntax_tools_test.erl", + "type_specs.erl"]. + t_igor(Config) when is_list(Config) -> DataDir = ?config(data_dir, Config), PrivDir = ?config(priv_dir, Config), @@ -222,6 +229,12 @@ t_igor(Config) when is_list(Config) -> FileM2 = filename:join(DataDir,"m2.erl"), ["m.erl",_]=R = igor:merge(m,[FileM1,FileM2],[{outdir,PrivDir}]), io:format("igor:merge/3 = ~p~n", [R]), + + FileTypeSpecs = filename:join(DataDir,"igor_type_specs.erl"), + Empty = filename:join(DataDir,"empty.erl"), + ["n.erl",_]=R2 = igor:merge(n,[FileTypeSpecs,Empty],[{outdir,PrivDir}]), + io:format("igor:merge/3 = ~p~n", [R2]), + ok. test_comment_scan([],_) -> ok; diff --git a/lib/syntax_tools/test/syntax_tools_SUITE_data/empty.erl b/lib/syntax_tools/test/syntax_tools_SUITE_data/empty.erl new file mode 100644 index 0000000000..877ff66013 --- /dev/null +++ b/lib/syntax_tools/test/syntax_tools_SUITE_data/empty.erl @@ -0,0 +1 @@ +-module(empty). diff --git a/lib/syntax_tools/test/syntax_tools_SUITE_data/igor_type_specs.erl b/lib/syntax_tools/test/syntax_tools_SUITE_data/igor_type_specs.erl new file mode 100644 index 0000000000..5a156c7fa3 --- /dev/null +++ b/lib/syntax_tools/test/syntax_tools_SUITE_data/igor_type_specs.erl @@ -0,0 +1,80 @@ +%% Same as ./type_specs.erl, but without macros. +-module(igor_type_specs). + +-include_lib("syntax_tools/include/merl.hrl"). + +-export([f/1, b/0, c/2]). + +-export_type([t/0, ot/2, ff2/0]). + +-type aa() :: _. + +-type t() :: integer(). + +-type ff(A) :: ot(A, A) | tuple() | 1..3 | map() | {}. +-type ff1() :: ff(bin()) | foo:bar(). +-type ff2() :: {list(), [_], list(integer()), + nonempty_list(), nonempty_list(atom()), [ff1(), ...], + nil(), []}. +-type bin() :: <<>> + | <<_:(+4)>> + | <<_:_*8>> + | <<_:12, _:_*16>> + | <<_:16, _:_*(0)>> % same as "<<_:16>>" + | <<_:16, _:_*(+0)>>. + +-callback cb() -> t(). + +-optional_callbacks([cb/0]). + +-opaque ot(A, B) :: {A, B}. + +-type f1() :: fun(). +-type f2() :: fun((...) -> t()). +-type f3() :: fun(() -> t()). +-type f4() :: fun((t(), t()) -> t()). + +-wild(attribute). + +-record(par, {a :: undefined | igor_type_specs}). + +-record(r0, {}). + +-record(r, + {f1 :: integer(), + f2 = a :: atom(), + f3 :: fun(), + f4 = 7}). + +-type r0() :: #r0{} | #r{f1 :: 3} | #r{f1 :: 3, f2 :: 'sju'}. + +-type m1() :: #{}. +-type m2() :: #{a => m1(), b => #{} | fy:m2()}. +-type b1() :: B1 :: binary() | (BitString :: bitstring()). + +-define(PAIR(A, B), {(A), (B)}). + +-spec igor_type_specs:f({r0(), r0()}) -> {t(), t()}. + +f({R, R}) -> + _ = "igor_type_specs" ++ "hej", + _ = <<"foo">>, + _ = R#r.f1, + _ = R#r{f1 = 17, f2 = b}, + {1, 1}. + +-spec igor_type_specs:b() -> integer() | fun(). + +b() -> + case foo:bar() of + #{a := 2} -> 19 + end. + +-spec c(Atom :: atom(), Integer :: integer()) -> {atom(), integer()}; + (X, Y) -> {atom(), float()} when X :: atom(), + is_subtype(Y, float()); + (integer(), atom()) -> {integer(), atom()}. + +c(A, B) -> + _ = integer, + {A, B}. diff --git a/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl b/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl new file mode 100644 index 0000000000..5621d3a293 --- /dev/null +++ b/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl @@ -0,0 +1,84 @@ +-module(type_specs). + +-include_lib("syntax_tools/include/merl.hrl"). + +-export([f/1, b/0, c/2]). + +-export_type([t/0, ot/2, ff2/0]). + +-type aa() :: _. + +-type t() :: integer(). + +-type ff(A) :: ot(A, A) | tuple() | 1..3 | map() | {}. +-type ff1() :: ff(bin()) | foo:bar(). +-type ff2() :: {list(), [_], list(integer()), + nonempty_list(), nonempty_list(atom()), [ff1(), ...], + nil(), []}. +-type bin() :: <<>> + | <<_:(+4)>> + | <<_:_*8>> + | <<_:12, _:_*16>> + | <<_:16, _:_*(0)>> % same as "<<_:16>>" + | <<_:16, _:_*(+0)>>. + +-callback cb() -> t(). + +-optional_callbacks([cb/0]). + +-opaque ot(A, B) :: {A, B}. + +-type f1() :: fun(). +-type f2() :: fun((...) -> t()). +-type f3() :: fun(() -> t()). +-type f4() :: fun((t(), t()) -> t()). + +-wild(attribute). + +-record(par, {a :: undefined | ?MODULE}). + +-record(r0, {}). + +-record(r, + {f1 :: integer(), + f2 = a :: atom(), + f3 :: fun(), + f4 = 7}). + +-type r0() :: #r0{} | #r{f1 :: 3} | #r{f1 :: 3, f2 :: 'sju'}. + +-type m1() :: #{} | map(). +-type m2() :: #{a := m1(), b => #{} | fy:m2()}. +-type m3() :: #{...}. +-type m4() :: #{_ => _, ...}. +-type m5() :: #{any() => any(), ...}. % Currently printed as `#{..., ...}'. +-type b1() :: B1 :: binary() | (BitString :: bitstring()). + +-define(PAIR(A, B), {(A), (B)}). + +-spec ?MODULE:f(?PAIR(r0(), r0())) -> ?PAIR(t(), t()). + +f({R, R}) -> + _ = ?MODULE_STRING ++ "hej", + _ = <<"foo">>, + _ = R#r.f1, + _ = R#r{f1 = 17, f2 = b}, + {1, 1}. + +-spec ?MODULE:b() -> integer() | fun(). + +b() -> + case foo:bar() of + #{a := 2} -> 19 + end. + +-define(I, integer). + +-spec c(Atom :: atom(), Integer :: ?I()) -> {atom(), integer()}; + (X, Y) -> {atom(), float()} when X :: atom(), + is_subtype(Y, float()); + (integer(), atom()) -> {integer(), atom()}. + +c(A, B) -> + _ = ?I, + {A, B}. diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf index 4f7223e147..786e536f93 100644 --- a/lib/wx/api_gen/wxapi.conf +++ b/lib/wx/api_gen/wxapi.conf @@ -802,9 +802,9 @@ 'CanRedo','CanUndo','Copy','Cut','GetInsertionPoint','GetLastPosition', 'GetValue','Paste','Redo','Replace','Remove','SetInsertionPoint', 'SetInsertionPointEnd','SetSelection','SetValue','Undo']}. -{class, wxGauge, wxControl, [], - ['wxGauge','~wxGauge','Create','GetBezelFace','GetRange','GetShadowWidth', - 'GetValue','IsVertical','SetBezelFace','SetRange','SetShadowWidth','SetValue', +{class, wxGauge, wxControl, [], + ['wxGauge','~wxGauge','Create','GetRange', + 'GetValue','IsVertical','SetRange','SetValue', 'Pulse']}. {class, wxGenericDirCtrl, wxControl, [], ['wxGenericDirCtrl','~wxGenericDirCtrl','Create','Init','CollapseTree', diff --git a/lib/wx/c_src/gen/wxe_funcs.cpp b/lib/wx/c_src/gen/wxe_funcs.cpp index 283e97f4e2..942baf7c7f 100644 --- a/lib/wx/c_src/gen/wxe_funcs.cpp +++ b/lib/wx/c_src/gen/wxe_funcs.cpp @@ -14630,13 +14630,6 @@ validator = (wxValidator *) getPtr(bp,memenv); bp += 4; rt.addBool(Result); break; } -case wxGauge_GetBezelFace: { // wxGauge::GetBezelFace - wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; - if(!This) throw wxe_badarg(0); - int Result = This->GetBezelFace(); - rt.addInt(Result); - break; -} case wxGauge_GetRange: { // wxGauge::GetRange wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; if(!This) throw wxe_badarg(0); @@ -14644,13 +14637,6 @@ case wxGauge_GetRange: { // wxGauge::GetRange rt.addInt(Result); break; } -case wxGauge_GetShadowWidth: { // wxGauge::GetShadowWidth - wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; - if(!This) throw wxe_badarg(0); - int Result = This->GetShadowWidth(); - rt.addInt(Result); - break; -} case wxGauge_GetValue: { // wxGauge::GetValue wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; if(!This) throw wxe_badarg(0); @@ -14665,13 +14651,6 @@ case wxGauge_IsVertical: { // wxGauge::IsVertical rt.addBool(Result); break; } -case wxGauge_SetBezelFace: { // wxGauge::SetBezelFace - wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; - int * w = (int *) bp; bp += 4; - if(!This) throw wxe_badarg(0); - This->SetBezelFace(*w); - break; -} case wxGauge_SetRange: { // wxGauge::SetRange wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; int * r = (int *) bp; bp += 4; @@ -14679,13 +14658,6 @@ case wxGauge_SetRange: { // wxGauge::SetRange This->SetRange(*r); break; } -case wxGauge_SetShadowWidth: { // wxGauge::SetShadowWidth - wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; - int * w = (int *) bp; bp += 4; - if(!This) throw wxe_badarg(0); - This->SetShadowWidth(*w); - break; -} case wxGauge_SetValue: { // wxGauge::SetValue wxGauge *This = (wxGauge *) getPtr(bp,memenv); bp += 4; int * pos = (int *) bp; bp += 4; diff --git a/lib/wx/c_src/gen/wxe_macros.h b/lib/wx/c_src/gen/wxe_macros.h index 0d3b79b7f9..82b39b49cd 100644 --- a/lib/wx/c_src/gen/wxe_macros.h +++ b/lib/wx/c_src/gen/wxe_macros.h @@ -1506,1924 +1506,1920 @@ #define wxGauge_new_0 1602 #define wxGauge_new_4 1603 #define wxGauge_Create 1604 -#define wxGauge_GetBezelFace 1605 -#define wxGauge_GetRange 1606 -#define wxGauge_GetShadowWidth 1607 -#define wxGauge_GetValue 1608 -#define wxGauge_IsVertical 1609 -#define wxGauge_SetBezelFace 1610 -#define wxGauge_SetRange 1611 -#define wxGauge_SetShadowWidth 1612 -#define wxGauge_SetValue 1613 -#define wxGauge_Pulse 1614 -#define wxGauge_destroy 1615 -#define wxGenericDirCtrl_new_0 1616 -#define wxGenericDirCtrl_new_2 1617 -#define wxGenericDirCtrl_destruct 1618 -#define wxGenericDirCtrl_Create 1619 -#define wxGenericDirCtrl_Init 1620 -#define wxGenericDirCtrl_CollapseTree 1621 -#define wxGenericDirCtrl_ExpandPath 1622 -#define wxGenericDirCtrl_GetDefaultPath 1623 -#define wxGenericDirCtrl_GetPath 1624 -#define wxGenericDirCtrl_GetFilePath 1625 -#define wxGenericDirCtrl_GetFilter 1626 -#define wxGenericDirCtrl_GetFilterIndex 1627 -#define wxGenericDirCtrl_GetRootId 1628 -#define wxGenericDirCtrl_GetTreeCtrl 1629 -#define wxGenericDirCtrl_ReCreateTree 1630 -#define wxGenericDirCtrl_SetDefaultPath 1631 -#define wxGenericDirCtrl_SetFilter 1632 -#define wxGenericDirCtrl_SetFilterIndex 1633 -#define wxGenericDirCtrl_SetPath 1634 -#define wxStaticBox_new_4 1636 -#define wxStaticBox_new_0 1637 -#define wxStaticBox_Create 1638 -#define wxStaticBox_destroy 1639 -#define wxStaticLine_new_2 1641 -#define wxStaticLine_new_0 1642 -#define wxStaticLine_Create 1643 -#define wxStaticLine_IsVertical 1644 -#define wxStaticLine_GetDefaultSize 1645 -#define wxStaticLine_destroy 1646 -#define wxListBox_new_3 1649 -#define wxListBox_new_0 1650 -#define wxListBox_destruct 1652 -#define wxListBox_Create 1654 -#define wxListBox_Deselect 1655 -#define wxListBox_GetSelections 1656 -#define wxListBox_InsertItems 1657 -#define wxListBox_IsSelected 1658 -#define wxListBox_Set 1659 -#define wxListBox_HitTest 1660 -#define wxListBox_SetFirstItem_1_0 1661 -#define wxListBox_SetFirstItem_1_1 1662 -#define wxListCtrl_new_0 1663 -#define wxListCtrl_new_2 1664 -#define wxListCtrl_Arrange 1665 -#define wxListCtrl_AssignImageList 1666 -#define wxListCtrl_ClearAll 1667 -#define wxListCtrl_Create 1668 -#define wxListCtrl_DeleteAllItems 1669 -#define wxListCtrl_DeleteColumn 1670 -#define wxListCtrl_DeleteItem 1671 -#define wxListCtrl_EditLabel 1672 -#define wxListCtrl_EnsureVisible 1673 -#define wxListCtrl_FindItem_3_0 1674 -#define wxListCtrl_FindItem_3_1 1675 -#define wxListCtrl_GetColumn 1676 -#define wxListCtrl_GetColumnCount 1677 -#define wxListCtrl_GetColumnWidth 1678 -#define wxListCtrl_GetCountPerPage 1679 -#define wxListCtrl_GetEditControl 1680 -#define wxListCtrl_GetImageList 1681 -#define wxListCtrl_GetItem 1682 -#define wxListCtrl_GetItemBackgroundColour 1683 -#define wxListCtrl_GetItemCount 1684 -#define wxListCtrl_GetItemData 1685 -#define wxListCtrl_GetItemFont 1686 -#define wxListCtrl_GetItemPosition 1687 -#define wxListCtrl_GetItemRect 1688 -#define wxListCtrl_GetItemSpacing 1689 -#define wxListCtrl_GetItemState 1690 -#define wxListCtrl_GetItemText 1691 -#define wxListCtrl_GetItemTextColour 1692 -#define wxListCtrl_GetNextItem 1693 -#define wxListCtrl_GetSelectedItemCount 1694 -#define wxListCtrl_GetTextColour 1695 -#define wxListCtrl_GetTopItem 1696 -#define wxListCtrl_GetViewRect 1697 -#define wxListCtrl_HitTest 1698 -#define wxListCtrl_InsertColumn_2 1699 -#define wxListCtrl_InsertColumn_3 1700 -#define wxListCtrl_InsertItem_1 1701 -#define wxListCtrl_InsertItem_2_1 1702 -#define wxListCtrl_InsertItem_2_0 1703 -#define wxListCtrl_InsertItem_3 1704 -#define wxListCtrl_RefreshItem 1705 -#define wxListCtrl_RefreshItems 1706 -#define wxListCtrl_ScrollList 1707 -#define wxListCtrl_SetBackgroundColour 1708 -#define wxListCtrl_SetColumn 1709 -#define wxListCtrl_SetColumnWidth 1710 -#define wxListCtrl_SetImageList 1711 -#define wxListCtrl_SetItem_1 1712 -#define wxListCtrl_SetItem_4 1713 -#define wxListCtrl_SetItemBackgroundColour 1714 -#define wxListCtrl_SetItemCount 1715 -#define wxListCtrl_SetItemData 1716 -#define wxListCtrl_SetItemFont 1717 -#define wxListCtrl_SetItemImage 1718 -#define wxListCtrl_SetItemColumnImage 1719 -#define wxListCtrl_SetItemPosition 1720 -#define wxListCtrl_SetItemState 1721 -#define wxListCtrl_SetItemText 1722 -#define wxListCtrl_SetItemTextColour 1723 -#define wxListCtrl_SetSingleStyle 1724 -#define wxListCtrl_SetTextColour 1725 -#define wxListCtrl_SetWindowStyleFlag 1726 -#define wxListCtrl_SortItems 1727 -#define wxListCtrl_destroy 1728 -#define wxListView_ClearColumnImage 1729 -#define wxListView_Focus 1730 -#define wxListView_GetFirstSelected 1731 -#define wxListView_GetFocusedItem 1732 -#define wxListView_GetNextSelected 1733 -#define wxListView_IsSelected 1734 -#define wxListView_Select 1735 -#define wxListView_SetColumnImage 1736 -#define wxListItem_new_0 1737 -#define wxListItem_new_1 1738 -#define wxListItem_destruct 1739 -#define wxListItem_Clear 1740 -#define wxListItem_GetAlign 1741 -#define wxListItem_GetBackgroundColour 1742 -#define wxListItem_GetColumn 1743 -#define wxListItem_GetFont 1744 -#define wxListItem_GetId 1745 -#define wxListItem_GetImage 1746 -#define wxListItem_GetMask 1747 -#define wxListItem_GetState 1748 -#define wxListItem_GetText 1749 -#define wxListItem_GetTextColour 1750 -#define wxListItem_GetWidth 1751 -#define wxListItem_SetAlign 1752 -#define wxListItem_SetBackgroundColour 1753 -#define wxListItem_SetColumn 1754 -#define wxListItem_SetFont 1755 -#define wxListItem_SetId 1756 -#define wxListItem_SetImage 1757 -#define wxListItem_SetMask 1758 -#define wxListItem_SetState 1759 -#define wxListItem_SetStateMask 1760 -#define wxListItem_SetText 1761 -#define wxListItem_SetTextColour 1762 -#define wxListItem_SetWidth 1763 -#define wxListItemAttr_new_0 1764 -#define wxListItemAttr_new_3 1765 -#define wxListItemAttr_GetBackgroundColour 1766 -#define wxListItemAttr_GetFont 1767 -#define wxListItemAttr_GetTextColour 1768 -#define wxListItemAttr_HasBackgroundColour 1769 -#define wxListItemAttr_HasFont 1770 -#define wxListItemAttr_HasTextColour 1771 -#define wxListItemAttr_SetBackgroundColour 1772 -#define wxListItemAttr_SetFont 1773 -#define wxListItemAttr_SetTextColour 1774 -#define wxListItemAttr_destroy 1775 -#define wxImageList_new_0 1776 -#define wxImageList_new_3 1777 -#define wxImageList_Add_1 1778 -#define wxImageList_Add_2_0 1779 -#define wxImageList_Add_2_1 1780 -#define wxImageList_Create 1781 -#define wxImageList_Draw 1783 -#define wxImageList_GetBitmap 1784 -#define wxImageList_GetIcon 1785 -#define wxImageList_GetImageCount 1786 -#define wxImageList_GetSize 1787 -#define wxImageList_Remove 1788 -#define wxImageList_RemoveAll 1789 -#define wxImageList_Replace_2 1790 -#define wxImageList_Replace_3 1791 -#define wxImageList_destroy 1792 -#define wxTextAttr_new_0 1793 -#define wxTextAttr_new_2 1794 -#define wxTextAttr_GetAlignment 1795 -#define wxTextAttr_GetBackgroundColour 1796 -#define wxTextAttr_GetFont 1797 -#define wxTextAttr_GetLeftIndent 1798 -#define wxTextAttr_GetLeftSubIndent 1799 -#define wxTextAttr_GetRightIndent 1800 -#define wxTextAttr_GetTabs 1801 -#define wxTextAttr_GetTextColour 1802 -#define wxTextAttr_HasBackgroundColour 1803 -#define wxTextAttr_HasFont 1804 -#define wxTextAttr_HasTextColour 1805 -#define wxTextAttr_GetFlags 1806 -#define wxTextAttr_IsDefault 1807 -#define wxTextAttr_SetAlignment 1808 -#define wxTextAttr_SetBackgroundColour 1809 -#define wxTextAttr_SetFlags 1810 -#define wxTextAttr_SetFont 1811 -#define wxTextAttr_SetLeftIndent 1812 -#define wxTextAttr_SetRightIndent 1813 -#define wxTextAttr_SetTabs 1814 -#define wxTextAttr_SetTextColour 1815 -#define wxTextAttr_destroy 1816 -#define wxTextCtrl_new_3 1818 -#define wxTextCtrl_new_0 1819 -#define wxTextCtrl_destruct 1821 -#define wxTextCtrl_AppendText 1822 -#define wxTextCtrl_CanCopy 1823 -#define wxTextCtrl_CanCut 1824 -#define wxTextCtrl_CanPaste 1825 -#define wxTextCtrl_CanRedo 1826 -#define wxTextCtrl_CanUndo 1827 -#define wxTextCtrl_Clear 1828 -#define wxTextCtrl_Copy 1829 -#define wxTextCtrl_Create 1830 -#define wxTextCtrl_Cut 1831 -#define wxTextCtrl_DiscardEdits 1832 -#define wxTextCtrl_ChangeValue 1833 -#define wxTextCtrl_EmulateKeyPress 1834 -#define wxTextCtrl_GetDefaultStyle 1835 -#define wxTextCtrl_GetInsertionPoint 1836 -#define wxTextCtrl_GetLastPosition 1837 -#define wxTextCtrl_GetLineLength 1838 -#define wxTextCtrl_GetLineText 1839 -#define wxTextCtrl_GetNumberOfLines 1840 -#define wxTextCtrl_GetRange 1841 -#define wxTextCtrl_GetSelection 1842 -#define wxTextCtrl_GetStringSelection 1843 -#define wxTextCtrl_GetStyle 1844 -#define wxTextCtrl_GetValue 1845 -#define wxTextCtrl_IsEditable 1846 -#define wxTextCtrl_IsModified 1847 -#define wxTextCtrl_IsMultiLine 1848 -#define wxTextCtrl_IsSingleLine 1849 -#define wxTextCtrl_LoadFile 1850 -#define wxTextCtrl_MarkDirty 1851 -#define wxTextCtrl_Paste 1852 -#define wxTextCtrl_PositionToXY 1853 -#define wxTextCtrl_Redo 1854 -#define wxTextCtrl_Remove 1855 -#define wxTextCtrl_Replace 1856 -#define wxTextCtrl_SaveFile 1857 -#define wxTextCtrl_SetDefaultStyle 1858 -#define wxTextCtrl_SetEditable 1859 -#define wxTextCtrl_SetInsertionPoint 1860 -#define wxTextCtrl_SetInsertionPointEnd 1861 -#define wxTextCtrl_SetMaxLength 1863 -#define wxTextCtrl_SetSelection 1864 -#define wxTextCtrl_SetStyle 1865 -#define wxTextCtrl_SetValue 1866 -#define wxTextCtrl_ShowPosition 1867 -#define wxTextCtrl_Undo 1868 -#define wxTextCtrl_WriteText 1869 -#define wxTextCtrl_XYToPosition 1870 -#define wxNotebook_new_0 1873 -#define wxNotebook_new_3 1874 -#define wxNotebook_destruct 1875 -#define wxNotebook_AddPage 1876 -#define wxNotebook_AdvanceSelection 1877 -#define wxNotebook_AssignImageList 1878 -#define wxNotebook_Create 1879 -#define wxNotebook_DeleteAllPages 1880 -#define wxNotebook_DeletePage 1881 -#define wxNotebook_RemovePage 1882 -#define wxNotebook_GetCurrentPage 1883 -#define wxNotebook_GetImageList 1884 -#define wxNotebook_GetPage 1886 -#define wxNotebook_GetPageCount 1887 -#define wxNotebook_GetPageImage 1888 -#define wxNotebook_GetPageText 1889 -#define wxNotebook_GetRowCount 1890 -#define wxNotebook_GetSelection 1891 -#define wxNotebook_GetThemeBackgroundColour 1892 -#define wxNotebook_HitTest 1894 -#define wxNotebook_InsertPage 1896 -#define wxNotebook_SetImageList 1897 -#define wxNotebook_SetPadding 1898 -#define wxNotebook_SetPageSize 1899 -#define wxNotebook_SetPageImage 1900 -#define wxNotebook_SetPageText 1901 -#define wxNotebook_SetSelection 1902 -#define wxNotebook_ChangeSelection 1903 -#define wxChoicebook_new_0 1904 -#define wxChoicebook_new_3 1905 -#define wxChoicebook_AddPage 1906 -#define wxChoicebook_AdvanceSelection 1907 -#define wxChoicebook_AssignImageList 1908 -#define wxChoicebook_Create 1909 -#define wxChoicebook_DeleteAllPages 1910 -#define wxChoicebook_DeletePage 1911 -#define wxChoicebook_RemovePage 1912 -#define wxChoicebook_GetCurrentPage 1913 -#define wxChoicebook_GetImageList 1914 -#define wxChoicebook_GetPage 1916 -#define wxChoicebook_GetPageCount 1917 -#define wxChoicebook_GetPageImage 1918 -#define wxChoicebook_GetPageText 1919 -#define wxChoicebook_GetSelection 1920 -#define wxChoicebook_HitTest 1921 -#define wxChoicebook_InsertPage 1922 -#define wxChoicebook_SetImageList 1923 -#define wxChoicebook_SetPageSize 1924 -#define wxChoicebook_SetPageImage 1925 -#define wxChoicebook_SetPageText 1926 -#define wxChoicebook_SetSelection 1927 -#define wxChoicebook_ChangeSelection 1928 -#define wxChoicebook_destroy 1929 -#define wxToolbook_new_0 1930 -#define wxToolbook_new_3 1931 -#define wxToolbook_AddPage 1932 -#define wxToolbook_AdvanceSelection 1933 -#define wxToolbook_AssignImageList 1934 -#define wxToolbook_Create 1935 -#define wxToolbook_DeleteAllPages 1936 -#define wxToolbook_DeletePage 1937 -#define wxToolbook_RemovePage 1938 -#define wxToolbook_GetCurrentPage 1939 -#define wxToolbook_GetImageList 1940 -#define wxToolbook_GetPage 1942 -#define wxToolbook_GetPageCount 1943 -#define wxToolbook_GetPageImage 1944 -#define wxToolbook_GetPageText 1945 -#define wxToolbook_GetSelection 1946 -#define wxToolbook_HitTest 1948 -#define wxToolbook_InsertPage 1949 -#define wxToolbook_SetImageList 1950 -#define wxToolbook_SetPageSize 1951 -#define wxToolbook_SetPageImage 1952 -#define wxToolbook_SetPageText 1953 -#define wxToolbook_SetSelection 1954 -#define wxToolbook_ChangeSelection 1955 -#define wxToolbook_destroy 1956 -#define wxListbook_new_0 1957 -#define wxListbook_new_3 1958 -#define wxListbook_AddPage 1959 -#define wxListbook_AdvanceSelection 1960 -#define wxListbook_AssignImageList 1961 -#define wxListbook_Create 1962 -#define wxListbook_DeleteAllPages 1963 -#define wxListbook_DeletePage 1964 -#define wxListbook_RemovePage 1965 -#define wxListbook_GetCurrentPage 1966 -#define wxListbook_GetImageList 1967 -#define wxListbook_GetPage 1969 -#define wxListbook_GetPageCount 1970 -#define wxListbook_GetPageImage 1971 -#define wxListbook_GetPageText 1972 -#define wxListbook_GetSelection 1973 -#define wxListbook_HitTest 1975 -#define wxListbook_InsertPage 1976 -#define wxListbook_SetImageList 1977 -#define wxListbook_SetPageSize 1978 -#define wxListbook_SetPageImage 1979 -#define wxListbook_SetPageText 1980 -#define wxListbook_SetSelection 1981 -#define wxListbook_ChangeSelection 1982 -#define wxListbook_destroy 1983 -#define wxTreebook_new_0 1984 -#define wxTreebook_new_3 1985 -#define wxTreebook_AddPage 1986 -#define wxTreebook_AdvanceSelection 1987 -#define wxTreebook_AssignImageList 1988 -#define wxTreebook_Create 1989 -#define wxTreebook_DeleteAllPages 1990 -#define wxTreebook_DeletePage 1991 -#define wxTreebook_RemovePage 1992 -#define wxTreebook_GetCurrentPage 1993 -#define wxTreebook_GetImageList 1994 -#define wxTreebook_GetPage 1996 -#define wxTreebook_GetPageCount 1997 -#define wxTreebook_GetPageImage 1998 -#define wxTreebook_GetPageText 1999 -#define wxTreebook_GetSelection 2000 -#define wxTreebook_ExpandNode 2001 -#define wxTreebook_IsNodeExpanded 2002 -#define wxTreebook_HitTest 2004 -#define wxTreebook_InsertPage 2005 -#define wxTreebook_InsertSubPage 2006 -#define wxTreebook_SetImageList 2007 -#define wxTreebook_SetPageSize 2008 -#define wxTreebook_SetPageImage 2009 -#define wxTreebook_SetPageText 2010 -#define wxTreebook_SetSelection 2011 -#define wxTreebook_ChangeSelection 2012 -#define wxTreebook_destroy 2013 -#define wxTreeCtrl_new_2 2016 -#define wxTreeCtrl_new_0 2017 -#define wxTreeCtrl_destruct 2019 -#define wxTreeCtrl_AddRoot 2020 -#define wxTreeCtrl_AppendItem 2021 -#define wxTreeCtrl_AssignImageList 2022 -#define wxTreeCtrl_AssignStateImageList 2023 -#define wxTreeCtrl_Collapse 2024 -#define wxTreeCtrl_CollapseAndReset 2025 -#define wxTreeCtrl_Create 2026 -#define wxTreeCtrl_Delete 2027 -#define wxTreeCtrl_DeleteAllItems 2028 -#define wxTreeCtrl_DeleteChildren 2029 -#define wxTreeCtrl_EditLabel 2030 -#define wxTreeCtrl_EnsureVisible 2031 -#define wxTreeCtrl_Expand 2032 -#define wxTreeCtrl_GetBoundingRect 2033 -#define wxTreeCtrl_GetChildrenCount 2035 -#define wxTreeCtrl_GetCount 2036 -#define wxTreeCtrl_GetEditControl 2037 -#define wxTreeCtrl_GetFirstChild 2038 -#define wxTreeCtrl_GetNextChild 2039 -#define wxTreeCtrl_GetFirstVisibleItem 2040 -#define wxTreeCtrl_GetImageList 2041 -#define wxTreeCtrl_GetIndent 2042 -#define wxTreeCtrl_GetItemBackgroundColour 2043 -#define wxTreeCtrl_GetItemData 2044 -#define wxTreeCtrl_GetItemFont 2045 -#define wxTreeCtrl_GetItemImage_1 2046 -#define wxTreeCtrl_GetItemImage_2 2047 -#define wxTreeCtrl_GetItemText 2048 -#define wxTreeCtrl_GetItemTextColour 2049 -#define wxTreeCtrl_GetLastChild 2050 -#define wxTreeCtrl_GetNextSibling 2051 -#define wxTreeCtrl_GetNextVisible 2052 -#define wxTreeCtrl_GetItemParent 2053 -#define wxTreeCtrl_GetPrevSibling 2054 -#define wxTreeCtrl_GetPrevVisible 2055 -#define wxTreeCtrl_GetRootItem 2056 -#define wxTreeCtrl_GetSelection 2057 -#define wxTreeCtrl_GetSelections 2058 -#define wxTreeCtrl_GetStateImageList 2059 -#define wxTreeCtrl_HitTest 2060 -#define wxTreeCtrl_InsertItem 2062 -#define wxTreeCtrl_IsBold 2063 -#define wxTreeCtrl_IsExpanded 2064 -#define wxTreeCtrl_IsSelected 2065 -#define wxTreeCtrl_IsVisible 2066 -#define wxTreeCtrl_ItemHasChildren 2067 -#define wxTreeCtrl_IsTreeItemIdOk 2068 -#define wxTreeCtrl_PrependItem 2069 -#define wxTreeCtrl_ScrollTo 2070 -#define wxTreeCtrl_SelectItem_1 2071 -#define wxTreeCtrl_SelectItem_2 2072 -#define wxTreeCtrl_SetIndent 2073 -#define wxTreeCtrl_SetImageList 2074 -#define wxTreeCtrl_SetItemBackgroundColour 2075 -#define wxTreeCtrl_SetItemBold 2076 -#define wxTreeCtrl_SetItemData 2077 -#define wxTreeCtrl_SetItemDropHighlight 2078 -#define wxTreeCtrl_SetItemFont 2079 -#define wxTreeCtrl_SetItemHasChildren 2080 -#define wxTreeCtrl_SetItemImage_2 2081 -#define wxTreeCtrl_SetItemImage_3 2082 -#define wxTreeCtrl_SetItemText 2083 -#define wxTreeCtrl_SetItemTextColour 2084 -#define wxTreeCtrl_SetStateImageList 2085 -#define wxTreeCtrl_SetWindowStyle 2086 -#define wxTreeCtrl_SortChildren 2087 -#define wxTreeCtrl_Toggle 2088 -#define wxTreeCtrl_ToggleItemSelection 2089 -#define wxTreeCtrl_Unselect 2090 -#define wxTreeCtrl_UnselectAll 2091 -#define wxTreeCtrl_UnselectItem 2092 -#define wxScrollBar_new_0 2093 -#define wxScrollBar_new_3 2094 -#define wxScrollBar_destruct 2095 -#define wxScrollBar_Create 2096 -#define wxScrollBar_GetRange 2097 -#define wxScrollBar_GetPageSize 2098 -#define wxScrollBar_GetThumbPosition 2099 -#define wxScrollBar_GetThumbSize 2100 -#define wxScrollBar_SetThumbPosition 2101 -#define wxScrollBar_SetScrollbar 2102 -#define wxSpinButton_new_2 2104 -#define wxSpinButton_new_0 2105 -#define wxSpinButton_Create 2106 -#define wxSpinButton_GetMax 2107 -#define wxSpinButton_GetMin 2108 -#define wxSpinButton_GetValue 2109 -#define wxSpinButton_SetRange 2110 -#define wxSpinButton_SetValue 2111 -#define wxSpinButton_destroy 2112 -#define wxSpinCtrl_new_0 2113 -#define wxSpinCtrl_new_2 2114 -#define wxSpinCtrl_Create 2116 -#define wxSpinCtrl_SetValue_1_1 2119 -#define wxSpinCtrl_SetValue_1_0 2120 -#define wxSpinCtrl_GetValue 2122 -#define wxSpinCtrl_SetRange 2124 -#define wxSpinCtrl_SetSelection 2125 -#define wxSpinCtrl_GetMin 2127 -#define wxSpinCtrl_GetMax 2129 -#define wxSpinCtrl_destroy 2130 -#define wxStaticText_new_0 2131 -#define wxStaticText_new_4 2132 -#define wxStaticText_Create 2133 -#define wxStaticText_GetLabel 2134 -#define wxStaticText_SetLabel 2135 -#define wxStaticText_Wrap 2136 -#define wxStaticText_destroy 2137 -#define wxStaticBitmap_new_0 2138 -#define wxStaticBitmap_new_4 2139 -#define wxStaticBitmap_Create 2140 -#define wxStaticBitmap_GetBitmap 2141 -#define wxStaticBitmap_SetBitmap 2142 -#define wxStaticBitmap_destroy 2143 -#define wxRadioBox_new 2144 -#define wxRadioBox_destruct 2146 -#define wxRadioBox_Create 2147 -#define wxRadioBox_Enable_2 2148 -#define wxRadioBox_Enable_1 2149 -#define wxRadioBox_GetSelection 2150 -#define wxRadioBox_GetString 2151 -#define wxRadioBox_SetSelection 2152 -#define wxRadioBox_Show_2 2153 -#define wxRadioBox_Show_1 2154 -#define wxRadioBox_GetColumnCount 2155 -#define wxRadioBox_GetItemHelpText 2156 -#define wxRadioBox_GetItemToolTip 2157 -#define wxRadioBox_GetItemFromPoint 2159 -#define wxRadioBox_GetRowCount 2160 -#define wxRadioBox_IsItemEnabled 2161 -#define wxRadioBox_IsItemShown 2162 -#define wxRadioBox_SetItemHelpText 2163 -#define wxRadioBox_SetItemToolTip 2164 -#define wxRadioButton_new_0 2165 -#define wxRadioButton_new_4 2166 -#define wxRadioButton_Create 2167 -#define wxRadioButton_GetValue 2168 -#define wxRadioButton_SetValue 2169 -#define wxRadioButton_destroy 2170 -#define wxSlider_new_6 2172 -#define wxSlider_new_0 2173 -#define wxSlider_Create 2174 -#define wxSlider_GetLineSize 2175 -#define wxSlider_GetMax 2176 -#define wxSlider_GetMin 2177 -#define wxSlider_GetPageSize 2178 -#define wxSlider_GetThumbLength 2179 -#define wxSlider_GetValue 2180 -#define wxSlider_SetLineSize 2181 -#define wxSlider_SetPageSize 2182 -#define wxSlider_SetRange 2183 -#define wxSlider_SetThumbLength 2184 -#define wxSlider_SetValue 2185 -#define wxSlider_destroy 2186 -#define wxDialog_new_4 2188 -#define wxDialog_new_0 2189 -#define wxDialog_destruct 2191 -#define wxDialog_Create 2192 -#define wxDialog_CreateButtonSizer 2193 -#define wxDialog_CreateStdDialogButtonSizer 2194 -#define wxDialog_EndModal 2195 -#define wxDialog_GetAffirmativeId 2196 -#define wxDialog_GetReturnCode 2197 -#define wxDialog_IsModal 2198 -#define wxDialog_SetAffirmativeId 2199 -#define wxDialog_SetReturnCode 2200 -#define wxDialog_Show 2201 -#define wxDialog_ShowModal 2202 -#define wxColourDialog_new_0 2203 -#define wxColourDialog_new_2 2204 -#define wxColourDialog_destruct 2205 -#define wxColourDialog_Create 2206 -#define wxColourDialog_GetColourData 2207 -#define wxColourData_new_0 2208 -#define wxColourData_new_1 2209 -#define wxColourData_destruct 2210 -#define wxColourData_GetChooseFull 2211 -#define wxColourData_GetColour 2212 -#define wxColourData_GetCustomColour 2214 -#define wxColourData_SetChooseFull 2215 -#define wxColourData_SetColour 2216 -#define wxColourData_SetCustomColour 2217 -#define wxPalette_new_0 2218 -#define wxPalette_new_4 2219 -#define wxPalette_destruct 2221 -#define wxPalette_Create 2222 -#define wxPalette_GetColoursCount 2223 -#define wxPalette_GetPixel 2224 -#define wxPalette_GetRGB 2225 -#define wxPalette_IsOk 2226 -#define wxDirDialog_new 2230 -#define wxDirDialog_destruct 2231 -#define wxDirDialog_GetPath 2232 -#define wxDirDialog_GetMessage 2233 -#define wxDirDialog_SetMessage 2234 -#define wxDirDialog_SetPath 2235 -#define wxFileDialog_new 2239 -#define wxFileDialog_destruct 2240 -#define wxFileDialog_GetDirectory 2241 -#define wxFileDialog_GetFilename 2242 -#define wxFileDialog_GetFilenames 2243 -#define wxFileDialog_GetFilterIndex 2244 -#define wxFileDialog_GetMessage 2245 -#define wxFileDialog_GetPath 2246 -#define wxFileDialog_GetPaths 2247 -#define wxFileDialog_GetWildcard 2248 -#define wxFileDialog_SetDirectory 2249 -#define wxFileDialog_SetFilename 2250 -#define wxFileDialog_SetFilterIndex 2251 -#define wxFileDialog_SetMessage 2252 -#define wxFileDialog_SetPath 2253 -#define wxFileDialog_SetWildcard 2254 -#define wxPickerBase_SetInternalMargin 2255 -#define wxPickerBase_GetInternalMargin 2256 -#define wxPickerBase_SetTextCtrlProportion 2257 -#define wxPickerBase_SetPickerCtrlProportion 2258 -#define wxPickerBase_GetTextCtrlProportion 2259 -#define wxPickerBase_GetPickerCtrlProportion 2260 -#define wxPickerBase_HasTextCtrl 2261 -#define wxPickerBase_GetTextCtrl 2262 -#define wxPickerBase_IsTextCtrlGrowable 2263 -#define wxPickerBase_SetPickerCtrlGrowable 2264 -#define wxPickerBase_SetTextCtrlGrowable 2265 -#define wxPickerBase_IsPickerCtrlGrowable 2266 -#define wxFilePickerCtrl_new_0 2267 -#define wxFilePickerCtrl_new_3 2268 -#define wxFilePickerCtrl_Create 2269 -#define wxFilePickerCtrl_GetPath 2270 -#define wxFilePickerCtrl_SetPath 2271 -#define wxFilePickerCtrl_destroy 2272 -#define wxDirPickerCtrl_new_0 2273 -#define wxDirPickerCtrl_new_3 2274 -#define wxDirPickerCtrl_Create 2275 -#define wxDirPickerCtrl_GetPath 2276 -#define wxDirPickerCtrl_SetPath 2277 -#define wxDirPickerCtrl_destroy 2278 -#define wxColourPickerCtrl_new_0 2279 -#define wxColourPickerCtrl_new_3 2280 -#define wxColourPickerCtrl_Create 2281 -#define wxColourPickerCtrl_GetColour 2282 -#define wxColourPickerCtrl_SetColour_1_1 2283 -#define wxColourPickerCtrl_SetColour_1_0 2284 -#define wxColourPickerCtrl_destroy 2285 -#define wxDatePickerCtrl_new_0 2286 -#define wxDatePickerCtrl_new_3 2287 -#define wxDatePickerCtrl_GetRange 2288 -#define wxDatePickerCtrl_GetValue 2289 -#define wxDatePickerCtrl_SetRange 2290 -#define wxDatePickerCtrl_SetValue 2291 -#define wxDatePickerCtrl_destroy 2292 -#define wxFontPickerCtrl_new_0 2293 -#define wxFontPickerCtrl_new_3 2294 -#define wxFontPickerCtrl_Create 2295 -#define wxFontPickerCtrl_GetSelectedFont 2296 -#define wxFontPickerCtrl_SetSelectedFont 2297 -#define wxFontPickerCtrl_GetMaxPointSize 2298 -#define wxFontPickerCtrl_SetMaxPointSize 2299 -#define wxFontPickerCtrl_destroy 2300 -#define wxFindReplaceDialog_new_0 2303 -#define wxFindReplaceDialog_new_4 2304 -#define wxFindReplaceDialog_destruct 2305 -#define wxFindReplaceDialog_Create 2306 -#define wxFindReplaceDialog_GetData 2307 -#define wxFindReplaceData_new_0 2308 -#define wxFindReplaceData_new_1 2309 -#define wxFindReplaceData_GetFindString 2310 -#define wxFindReplaceData_GetReplaceString 2311 -#define wxFindReplaceData_GetFlags 2312 -#define wxFindReplaceData_SetFlags 2313 -#define wxFindReplaceData_SetFindString 2314 -#define wxFindReplaceData_SetReplaceString 2315 -#define wxFindReplaceData_destroy 2316 -#define wxMultiChoiceDialog_new_0 2317 -#define wxMultiChoiceDialog_new_5 2319 -#define wxMultiChoiceDialog_GetSelections 2320 -#define wxMultiChoiceDialog_SetSelections 2321 -#define wxMultiChoiceDialog_destroy 2322 -#define wxSingleChoiceDialog_new_0 2323 -#define wxSingleChoiceDialog_new_5 2325 -#define wxSingleChoiceDialog_GetSelection 2326 -#define wxSingleChoiceDialog_GetStringSelection 2327 -#define wxSingleChoiceDialog_SetSelection 2328 -#define wxSingleChoiceDialog_destroy 2329 -#define wxTextEntryDialog_new 2330 -#define wxTextEntryDialog_GetValue 2331 -#define wxTextEntryDialog_SetValue 2332 -#define wxTextEntryDialog_destroy 2333 -#define wxPasswordEntryDialog_new 2334 -#define wxPasswordEntryDialog_destroy 2335 -#define wxFontData_new_0 2336 -#define wxFontData_new_1 2337 -#define wxFontData_destruct 2338 -#define wxFontData_EnableEffects 2339 -#define wxFontData_GetAllowSymbols 2340 -#define wxFontData_GetColour 2341 -#define wxFontData_GetChosenFont 2342 -#define wxFontData_GetEnableEffects 2343 -#define wxFontData_GetInitialFont 2344 -#define wxFontData_GetShowHelp 2345 -#define wxFontData_SetAllowSymbols 2346 -#define wxFontData_SetChosenFont 2347 -#define wxFontData_SetColour 2348 -#define wxFontData_SetInitialFont 2349 -#define wxFontData_SetRange 2350 -#define wxFontData_SetShowHelp 2351 -#define wxFontDialog_new_0 2355 -#define wxFontDialog_new_2 2357 -#define wxFontDialog_Create 2359 -#define wxFontDialog_GetFontData 2360 -#define wxFontDialog_destroy 2362 -#define wxProgressDialog_new 2363 -#define wxProgressDialog_destruct 2364 -#define wxProgressDialog_Resume 2365 -#define wxProgressDialog_Update_2 2366 -#define wxProgressDialog_Update_0 2367 -#define wxMessageDialog_new 2368 -#define wxMessageDialog_destruct 2369 -#define wxPageSetupDialog_new 2370 -#define wxPageSetupDialog_destruct 2371 -#define wxPageSetupDialog_GetPageSetupData 2372 -#define wxPageSetupDialog_ShowModal 2373 -#define wxPageSetupDialogData_new_0 2374 -#define wxPageSetupDialogData_new_1_0 2375 -#define wxPageSetupDialogData_new_1_1 2376 -#define wxPageSetupDialogData_destruct 2377 -#define wxPageSetupDialogData_EnableHelp 2378 -#define wxPageSetupDialogData_EnableMargins 2379 -#define wxPageSetupDialogData_EnableOrientation 2380 -#define wxPageSetupDialogData_EnablePaper 2381 -#define wxPageSetupDialogData_EnablePrinter 2382 -#define wxPageSetupDialogData_GetDefaultMinMargins 2383 -#define wxPageSetupDialogData_GetEnableMargins 2384 -#define wxPageSetupDialogData_GetEnableOrientation 2385 -#define wxPageSetupDialogData_GetEnablePaper 2386 -#define wxPageSetupDialogData_GetEnablePrinter 2387 -#define wxPageSetupDialogData_GetEnableHelp 2388 -#define wxPageSetupDialogData_GetDefaultInfo 2389 -#define wxPageSetupDialogData_GetMarginTopLeft 2390 -#define wxPageSetupDialogData_GetMarginBottomRight 2391 -#define wxPageSetupDialogData_GetMinMarginTopLeft 2392 -#define wxPageSetupDialogData_GetMinMarginBottomRight 2393 -#define wxPageSetupDialogData_GetPaperId 2394 -#define wxPageSetupDialogData_GetPaperSize 2395 -#define wxPageSetupDialogData_GetPrintData 2397 -#define wxPageSetupDialogData_IsOk 2398 -#define wxPageSetupDialogData_SetDefaultInfo 2399 -#define wxPageSetupDialogData_SetDefaultMinMargins 2400 -#define wxPageSetupDialogData_SetMarginTopLeft 2401 -#define wxPageSetupDialogData_SetMarginBottomRight 2402 -#define wxPageSetupDialogData_SetMinMarginTopLeft 2403 -#define wxPageSetupDialogData_SetMinMarginBottomRight 2404 -#define wxPageSetupDialogData_SetPaperId 2405 -#define wxPageSetupDialogData_SetPaperSize_1_1 2406 -#define wxPageSetupDialogData_SetPaperSize_1_0 2407 -#define wxPageSetupDialogData_SetPrintData 2408 -#define wxPrintDialog_new_2_0 2409 -#define wxPrintDialog_new_2_1 2410 -#define wxPrintDialog_destruct 2411 -#define wxPrintDialog_GetPrintDialogData 2412 -#define wxPrintDialog_GetPrintDC 2413 -#define wxPrintDialogData_new_0 2414 -#define wxPrintDialogData_new_1_1 2415 -#define wxPrintDialogData_new_1_0 2416 -#define wxPrintDialogData_destruct 2417 -#define wxPrintDialogData_EnableHelp 2418 -#define wxPrintDialogData_EnablePageNumbers 2419 -#define wxPrintDialogData_EnablePrintToFile 2420 -#define wxPrintDialogData_EnableSelection 2421 -#define wxPrintDialogData_GetAllPages 2422 -#define wxPrintDialogData_GetCollate 2423 -#define wxPrintDialogData_GetFromPage 2424 -#define wxPrintDialogData_GetMaxPage 2425 -#define wxPrintDialogData_GetMinPage 2426 -#define wxPrintDialogData_GetNoCopies 2427 -#define wxPrintDialogData_GetPrintData 2428 -#define wxPrintDialogData_GetPrintToFile 2429 -#define wxPrintDialogData_GetSelection 2430 -#define wxPrintDialogData_GetToPage 2431 -#define wxPrintDialogData_IsOk 2432 -#define wxPrintDialogData_SetCollate 2433 -#define wxPrintDialogData_SetFromPage 2434 -#define wxPrintDialogData_SetMaxPage 2435 -#define wxPrintDialogData_SetMinPage 2436 -#define wxPrintDialogData_SetNoCopies 2437 -#define wxPrintDialogData_SetPrintData 2438 -#define wxPrintDialogData_SetPrintToFile 2439 -#define wxPrintDialogData_SetSelection 2440 -#define wxPrintDialogData_SetToPage 2441 -#define wxPrintData_new_0 2442 -#define wxPrintData_new_1 2443 -#define wxPrintData_destruct 2444 -#define wxPrintData_GetCollate 2445 -#define wxPrintData_GetBin 2446 -#define wxPrintData_GetColour 2447 -#define wxPrintData_GetDuplex 2448 -#define wxPrintData_GetNoCopies 2449 -#define wxPrintData_GetOrientation 2450 -#define wxPrintData_GetPaperId 2451 -#define wxPrintData_GetPrinterName 2452 -#define wxPrintData_GetQuality 2453 -#define wxPrintData_IsOk 2454 -#define wxPrintData_SetBin 2455 -#define wxPrintData_SetCollate 2456 -#define wxPrintData_SetColour 2457 -#define wxPrintData_SetDuplex 2458 -#define wxPrintData_SetNoCopies 2459 -#define wxPrintData_SetOrientation 2460 -#define wxPrintData_SetPaperId 2461 -#define wxPrintData_SetPrinterName 2462 -#define wxPrintData_SetQuality 2463 -#define wxPrintPreview_new_2 2466 -#define wxPrintPreview_new_3 2467 -#define wxPrintPreview_destruct 2469 -#define wxPrintPreview_GetCanvas 2470 -#define wxPrintPreview_GetCurrentPage 2471 -#define wxPrintPreview_GetFrame 2472 -#define wxPrintPreview_GetMaxPage 2473 -#define wxPrintPreview_GetMinPage 2474 -#define wxPrintPreview_GetPrintout 2475 -#define wxPrintPreview_GetPrintoutForPrinting 2476 -#define wxPrintPreview_IsOk 2477 -#define wxPrintPreview_PaintPage 2478 -#define wxPrintPreview_Print 2479 -#define wxPrintPreview_RenderPage 2480 -#define wxPrintPreview_SetCanvas 2481 -#define wxPrintPreview_SetCurrentPage 2482 -#define wxPrintPreview_SetFrame 2483 -#define wxPrintPreview_SetPrintout 2484 -#define wxPrintPreview_SetZoom 2485 -#define wxPreviewFrame_new 2486 -#define wxPreviewFrame_destruct 2487 -#define wxPreviewFrame_CreateControlBar 2488 -#define wxPreviewFrame_CreateCanvas 2489 -#define wxPreviewFrame_Initialize 2490 -#define wxPreviewFrame_OnCloseWindow 2491 -#define wxPreviewControlBar_new 2492 -#define wxPreviewControlBar_destruct 2493 -#define wxPreviewControlBar_CreateButtons 2494 -#define wxPreviewControlBar_GetPrintPreview 2495 -#define wxPreviewControlBar_GetZoomControl 2496 -#define wxPreviewControlBar_SetZoomControl 2497 -#define wxPrinter_new 2499 -#define wxPrinter_CreateAbortWindow 2500 -#define wxPrinter_GetAbort 2501 -#define wxPrinter_GetLastError 2502 -#define wxPrinter_GetPrintDialogData 2503 -#define wxPrinter_Print 2504 -#define wxPrinter_PrintDialog 2505 -#define wxPrinter_ReportError 2506 -#define wxPrinter_Setup 2507 -#define wxPrinter_destroy 2508 -#define wxXmlResource_new_1 2509 -#define wxXmlResource_new_2 2510 -#define wxXmlResource_destruct 2511 -#define wxXmlResource_AttachUnknownControl 2512 -#define wxXmlResource_ClearHandlers 2513 -#define wxXmlResource_CompareVersion 2514 -#define wxXmlResource_Get 2515 -#define wxXmlResource_GetFlags 2516 -#define wxXmlResource_GetVersion 2517 -#define wxXmlResource_GetXRCID 2518 -#define wxXmlResource_InitAllHandlers 2519 -#define wxXmlResource_Load 2520 -#define wxXmlResource_LoadBitmap 2521 -#define wxXmlResource_LoadDialog_2 2522 -#define wxXmlResource_LoadDialog_3 2523 -#define wxXmlResource_LoadFrame_2 2524 -#define wxXmlResource_LoadFrame_3 2525 -#define wxXmlResource_LoadIcon 2526 -#define wxXmlResource_LoadMenu 2527 -#define wxXmlResource_LoadMenuBar_2 2528 -#define wxXmlResource_LoadMenuBar_1 2529 -#define wxXmlResource_LoadPanel_2 2530 -#define wxXmlResource_LoadPanel_3 2531 -#define wxXmlResource_LoadToolBar 2532 -#define wxXmlResource_Set 2533 -#define wxXmlResource_SetFlags 2534 -#define wxXmlResource_Unload 2535 -#define wxXmlResource_xrcctrl 2536 -#define wxHtmlEasyPrinting_new 2537 -#define wxHtmlEasyPrinting_destruct 2538 -#define wxHtmlEasyPrinting_GetPrintData 2539 -#define wxHtmlEasyPrinting_GetPageSetupData 2540 -#define wxHtmlEasyPrinting_PreviewFile 2541 -#define wxHtmlEasyPrinting_PreviewText 2542 -#define wxHtmlEasyPrinting_PrintFile 2543 -#define wxHtmlEasyPrinting_PrintText 2544 -#define wxHtmlEasyPrinting_PageSetup 2545 -#define wxHtmlEasyPrinting_SetFonts 2546 -#define wxHtmlEasyPrinting_SetHeader 2547 -#define wxHtmlEasyPrinting_SetFooter 2548 -#define wxGLCanvas_new_2 2550 -#define wxGLCanvas_new_3_1 2551 -#define wxGLCanvas_new_3_0 2552 -#define wxGLCanvas_GetContext 2553 -#define wxGLCanvas_SetCurrent 2555 -#define wxGLCanvas_SwapBuffers 2556 -#define wxGLCanvas_destroy 2557 -#define wxAuiManager_new 2558 -#define wxAuiManager_destruct 2559 -#define wxAuiManager_AddPane_2_1 2560 -#define wxAuiManager_AddPane_3 2561 -#define wxAuiManager_AddPane_2_0 2562 -#define wxAuiManager_DetachPane 2563 -#define wxAuiManager_GetAllPanes 2564 -#define wxAuiManager_GetArtProvider 2565 -#define wxAuiManager_GetDockSizeConstraint 2566 -#define wxAuiManager_GetFlags 2567 -#define wxAuiManager_GetManagedWindow 2568 -#define wxAuiManager_GetManager 2569 -#define wxAuiManager_GetPane_1_1 2570 -#define wxAuiManager_GetPane_1_0 2571 -#define wxAuiManager_HideHint 2572 -#define wxAuiManager_InsertPane 2573 -#define wxAuiManager_LoadPaneInfo 2574 -#define wxAuiManager_LoadPerspective 2575 -#define wxAuiManager_SavePaneInfo 2576 -#define wxAuiManager_SavePerspective 2577 -#define wxAuiManager_SetArtProvider 2578 -#define wxAuiManager_SetDockSizeConstraint 2579 -#define wxAuiManager_SetFlags 2580 -#define wxAuiManager_SetManagedWindow 2581 -#define wxAuiManager_ShowHint 2582 -#define wxAuiManager_UnInit 2583 -#define wxAuiManager_Update 2584 -#define wxAuiPaneInfo_new_0 2585 -#define wxAuiPaneInfo_new_1 2586 -#define wxAuiPaneInfo_destruct 2587 -#define wxAuiPaneInfo_BestSize_1 2588 -#define wxAuiPaneInfo_BestSize_2 2589 -#define wxAuiPaneInfo_Bottom 2590 -#define wxAuiPaneInfo_BottomDockable 2591 -#define wxAuiPaneInfo_Caption 2592 -#define wxAuiPaneInfo_CaptionVisible 2593 -#define wxAuiPaneInfo_Centre 2594 -#define wxAuiPaneInfo_CentrePane 2595 -#define wxAuiPaneInfo_CloseButton 2596 -#define wxAuiPaneInfo_DefaultPane 2597 -#define wxAuiPaneInfo_DestroyOnClose 2598 -#define wxAuiPaneInfo_Direction 2599 -#define wxAuiPaneInfo_Dock 2600 -#define wxAuiPaneInfo_Dockable 2601 -#define wxAuiPaneInfo_Fixed 2602 -#define wxAuiPaneInfo_Float 2603 -#define wxAuiPaneInfo_Floatable 2604 -#define wxAuiPaneInfo_FloatingPosition_1 2605 -#define wxAuiPaneInfo_FloatingPosition_2 2606 -#define wxAuiPaneInfo_FloatingSize_1 2607 -#define wxAuiPaneInfo_FloatingSize_2 2608 -#define wxAuiPaneInfo_Gripper 2609 -#define wxAuiPaneInfo_GripperTop 2610 -#define wxAuiPaneInfo_HasBorder 2611 -#define wxAuiPaneInfo_HasCaption 2612 -#define wxAuiPaneInfo_HasCloseButton 2613 -#define wxAuiPaneInfo_HasFlag 2614 -#define wxAuiPaneInfo_HasGripper 2615 -#define wxAuiPaneInfo_HasGripperTop 2616 -#define wxAuiPaneInfo_HasMaximizeButton 2617 -#define wxAuiPaneInfo_HasMinimizeButton 2618 -#define wxAuiPaneInfo_HasPinButton 2619 -#define wxAuiPaneInfo_Hide 2620 -#define wxAuiPaneInfo_IsBottomDockable 2621 -#define wxAuiPaneInfo_IsDocked 2622 -#define wxAuiPaneInfo_IsFixed 2623 -#define wxAuiPaneInfo_IsFloatable 2624 -#define wxAuiPaneInfo_IsFloating 2625 -#define wxAuiPaneInfo_IsLeftDockable 2626 -#define wxAuiPaneInfo_IsMovable 2627 -#define wxAuiPaneInfo_IsOk 2628 -#define wxAuiPaneInfo_IsResizable 2629 -#define wxAuiPaneInfo_IsRightDockable 2630 -#define wxAuiPaneInfo_IsShown 2631 -#define wxAuiPaneInfo_IsToolbar 2632 -#define wxAuiPaneInfo_IsTopDockable 2633 -#define wxAuiPaneInfo_Layer 2634 -#define wxAuiPaneInfo_Left 2635 -#define wxAuiPaneInfo_LeftDockable 2636 -#define wxAuiPaneInfo_MaxSize_1 2637 -#define wxAuiPaneInfo_MaxSize_2 2638 -#define wxAuiPaneInfo_MaximizeButton 2639 -#define wxAuiPaneInfo_MinSize_1 2640 -#define wxAuiPaneInfo_MinSize_2 2641 -#define wxAuiPaneInfo_MinimizeButton 2642 -#define wxAuiPaneInfo_Movable 2643 -#define wxAuiPaneInfo_Name 2644 -#define wxAuiPaneInfo_PaneBorder 2645 -#define wxAuiPaneInfo_PinButton 2646 -#define wxAuiPaneInfo_Position 2647 -#define wxAuiPaneInfo_Resizable 2648 -#define wxAuiPaneInfo_Right 2649 -#define wxAuiPaneInfo_RightDockable 2650 -#define wxAuiPaneInfo_Row 2651 -#define wxAuiPaneInfo_SafeSet 2652 -#define wxAuiPaneInfo_SetFlag 2653 -#define wxAuiPaneInfo_Show 2654 -#define wxAuiPaneInfo_ToolbarPane 2655 -#define wxAuiPaneInfo_Top 2656 -#define wxAuiPaneInfo_TopDockable 2657 -#define wxAuiPaneInfo_Window 2658 -#define wxAuiPaneInfo_GetWindow 2659 -#define wxAuiPaneInfo_GetFrame 2660 -#define wxAuiPaneInfo_GetDirection 2661 -#define wxAuiPaneInfo_GetLayer 2662 -#define wxAuiPaneInfo_GetRow 2663 -#define wxAuiPaneInfo_GetPosition 2664 -#define wxAuiPaneInfo_GetFloatingPosition 2665 -#define wxAuiPaneInfo_GetFloatingSize 2666 -#define wxAuiNotebook_new_0 2667 -#define wxAuiNotebook_new_2 2668 -#define wxAuiNotebook_AddPage 2669 -#define wxAuiNotebook_Create 2670 -#define wxAuiNotebook_DeletePage 2671 -#define wxAuiNotebook_GetArtProvider 2672 -#define wxAuiNotebook_GetPage 2673 -#define wxAuiNotebook_GetPageBitmap 2674 -#define wxAuiNotebook_GetPageCount 2675 -#define wxAuiNotebook_GetPageIndex 2676 -#define wxAuiNotebook_GetPageText 2677 -#define wxAuiNotebook_GetSelection 2678 -#define wxAuiNotebook_InsertPage 2679 -#define wxAuiNotebook_RemovePage 2680 -#define wxAuiNotebook_SetArtProvider 2681 -#define wxAuiNotebook_SetFont 2682 -#define wxAuiNotebook_SetPageBitmap 2683 -#define wxAuiNotebook_SetPageText 2684 -#define wxAuiNotebook_SetSelection 2685 -#define wxAuiNotebook_SetTabCtrlHeight 2686 -#define wxAuiNotebook_SetUniformBitmapSize 2687 -#define wxAuiNotebook_destroy 2688 -#define wxAuiTabArt_SetFlags 2689 -#define wxAuiTabArt_SetMeasuringFont 2690 -#define wxAuiTabArt_SetNormalFont 2691 -#define wxAuiTabArt_SetSelectedFont 2692 -#define wxAuiTabArt_SetColour 2693 -#define wxAuiTabArt_SetActiveColour 2694 -#define wxAuiDockArt_GetColour 2695 -#define wxAuiDockArt_GetFont 2696 -#define wxAuiDockArt_GetMetric 2697 -#define wxAuiDockArt_SetColour 2698 -#define wxAuiDockArt_SetFont 2699 -#define wxAuiDockArt_SetMetric 2700 -#define wxAuiSimpleTabArt_new 2701 -#define wxAuiSimpleTabArt_destroy 2702 -#define wxMDIParentFrame_new_0 2703 -#define wxMDIParentFrame_new_4 2704 -#define wxMDIParentFrame_destruct 2705 -#define wxMDIParentFrame_ActivateNext 2706 -#define wxMDIParentFrame_ActivatePrevious 2707 -#define wxMDIParentFrame_ArrangeIcons 2708 -#define wxMDIParentFrame_Cascade 2709 -#define wxMDIParentFrame_Create 2710 -#define wxMDIParentFrame_GetActiveChild 2711 -#define wxMDIParentFrame_GetClientWindow 2712 -#define wxMDIParentFrame_Tile 2713 -#define wxMDIChildFrame_new_0 2714 -#define wxMDIChildFrame_new_4 2715 -#define wxMDIChildFrame_destruct 2716 -#define wxMDIChildFrame_Activate 2717 -#define wxMDIChildFrame_Create 2718 -#define wxMDIChildFrame_Maximize 2719 -#define wxMDIChildFrame_Restore 2720 -#define wxMDIClientWindow_new_0 2721 -#define wxMDIClientWindow_new_2 2722 -#define wxMDIClientWindow_destruct 2723 -#define wxMDIClientWindow_CreateClient 2724 -#define wxLayoutAlgorithm_new 2725 -#define wxLayoutAlgorithm_LayoutFrame 2726 -#define wxLayoutAlgorithm_LayoutMDIFrame 2727 -#define wxLayoutAlgorithm_LayoutWindow 2728 -#define wxLayoutAlgorithm_destroy 2729 -#define wxEvent_GetId 2730 -#define wxEvent_GetSkipped 2731 -#define wxEvent_GetTimestamp 2732 -#define wxEvent_IsCommandEvent 2733 -#define wxEvent_ResumePropagation 2734 -#define wxEvent_ShouldPropagate 2735 -#define wxEvent_Skip 2736 -#define wxEvent_StopPropagation 2737 -#define wxCommandEvent_getClientData 2738 -#define wxCommandEvent_GetExtraLong 2739 -#define wxCommandEvent_GetInt 2740 -#define wxCommandEvent_GetSelection 2741 -#define wxCommandEvent_GetString 2742 -#define wxCommandEvent_IsChecked 2743 -#define wxCommandEvent_IsSelection 2744 -#define wxCommandEvent_SetInt 2745 -#define wxCommandEvent_SetString 2746 -#define wxScrollEvent_GetOrientation 2747 -#define wxScrollEvent_GetPosition 2748 -#define wxScrollWinEvent_GetOrientation 2749 -#define wxScrollWinEvent_GetPosition 2750 -#define wxMouseEvent_AltDown 2751 -#define wxMouseEvent_Button 2752 -#define wxMouseEvent_ButtonDClick 2753 -#define wxMouseEvent_ButtonDown 2754 -#define wxMouseEvent_ButtonUp 2755 -#define wxMouseEvent_CmdDown 2756 -#define wxMouseEvent_ControlDown 2757 -#define wxMouseEvent_Dragging 2758 -#define wxMouseEvent_Entering 2759 -#define wxMouseEvent_GetButton 2760 -#define wxMouseEvent_GetPosition 2763 -#define wxMouseEvent_GetLogicalPosition 2764 -#define wxMouseEvent_GetLinesPerAction 2765 -#define wxMouseEvent_GetWheelRotation 2766 -#define wxMouseEvent_GetWheelDelta 2767 -#define wxMouseEvent_GetX 2768 -#define wxMouseEvent_GetY 2769 -#define wxMouseEvent_IsButton 2770 -#define wxMouseEvent_IsPageScroll 2771 -#define wxMouseEvent_Leaving 2772 -#define wxMouseEvent_LeftDClick 2773 -#define wxMouseEvent_LeftDown 2774 -#define wxMouseEvent_LeftIsDown 2775 -#define wxMouseEvent_LeftUp 2776 -#define wxMouseEvent_MetaDown 2777 -#define wxMouseEvent_MiddleDClick 2778 -#define wxMouseEvent_MiddleDown 2779 -#define wxMouseEvent_MiddleIsDown 2780 -#define wxMouseEvent_MiddleUp 2781 -#define wxMouseEvent_Moving 2782 -#define wxMouseEvent_RightDClick 2783 -#define wxMouseEvent_RightDown 2784 -#define wxMouseEvent_RightIsDown 2785 -#define wxMouseEvent_RightUp 2786 -#define wxMouseEvent_ShiftDown 2787 -#define wxSetCursorEvent_GetCursor 2788 -#define wxSetCursorEvent_GetX 2789 -#define wxSetCursorEvent_GetY 2790 -#define wxSetCursorEvent_HasCursor 2791 -#define wxSetCursorEvent_SetCursor 2792 -#define wxKeyEvent_AltDown 2793 -#define wxKeyEvent_CmdDown 2794 -#define wxKeyEvent_ControlDown 2795 -#define wxKeyEvent_GetKeyCode 2796 -#define wxKeyEvent_GetModifiers 2797 -#define wxKeyEvent_GetPosition 2800 -#define wxKeyEvent_GetRawKeyCode 2801 -#define wxKeyEvent_GetRawKeyFlags 2802 -#define wxKeyEvent_GetUnicodeKey 2803 -#define wxKeyEvent_GetX 2804 -#define wxKeyEvent_GetY 2805 -#define wxKeyEvent_HasModifiers 2806 -#define wxKeyEvent_MetaDown 2807 -#define wxKeyEvent_ShiftDown 2808 -#define wxSizeEvent_GetSize 2809 -#define wxMoveEvent_GetPosition 2810 -#define wxEraseEvent_GetDC 2811 -#define wxFocusEvent_GetWindow 2812 -#define wxChildFocusEvent_GetWindow 2813 -#define wxMenuEvent_GetMenu 2814 -#define wxMenuEvent_GetMenuId 2815 -#define wxMenuEvent_IsPopup 2816 -#define wxCloseEvent_CanVeto 2817 -#define wxCloseEvent_GetLoggingOff 2818 -#define wxCloseEvent_SetCanVeto 2819 -#define wxCloseEvent_SetLoggingOff 2820 -#define wxCloseEvent_Veto 2821 -#define wxShowEvent_SetShow 2822 -#define wxShowEvent_GetShow 2823 -#define wxIconizeEvent_Iconized 2824 -#define wxJoystickEvent_ButtonDown 2825 -#define wxJoystickEvent_ButtonIsDown 2826 -#define wxJoystickEvent_ButtonUp 2827 -#define wxJoystickEvent_GetButtonChange 2828 -#define wxJoystickEvent_GetButtonState 2829 -#define wxJoystickEvent_GetJoystick 2830 -#define wxJoystickEvent_GetPosition 2831 -#define wxJoystickEvent_GetZPosition 2832 -#define wxJoystickEvent_IsButton 2833 -#define wxJoystickEvent_IsMove 2834 -#define wxJoystickEvent_IsZMove 2835 -#define wxUpdateUIEvent_CanUpdate 2836 -#define wxUpdateUIEvent_Check 2837 -#define wxUpdateUIEvent_Enable 2838 -#define wxUpdateUIEvent_Show 2839 -#define wxUpdateUIEvent_GetChecked 2840 -#define wxUpdateUIEvent_GetEnabled 2841 -#define wxUpdateUIEvent_GetShown 2842 -#define wxUpdateUIEvent_GetSetChecked 2843 -#define wxUpdateUIEvent_GetSetEnabled 2844 -#define wxUpdateUIEvent_GetSetShown 2845 -#define wxUpdateUIEvent_GetSetText 2846 -#define wxUpdateUIEvent_GetText 2847 -#define wxUpdateUIEvent_GetMode 2848 -#define wxUpdateUIEvent_GetUpdateInterval 2849 -#define wxUpdateUIEvent_ResetUpdateTime 2850 -#define wxUpdateUIEvent_SetMode 2851 -#define wxUpdateUIEvent_SetText 2852 -#define wxUpdateUIEvent_SetUpdateInterval 2853 -#define wxMouseCaptureChangedEvent_GetCapturedWindow 2854 -#define wxPaletteChangedEvent_SetChangedWindow 2855 -#define wxPaletteChangedEvent_GetChangedWindow 2856 -#define wxQueryNewPaletteEvent_SetPaletteRealized 2857 -#define wxQueryNewPaletteEvent_GetPaletteRealized 2858 -#define wxNavigationKeyEvent_GetDirection 2859 -#define wxNavigationKeyEvent_SetDirection 2860 -#define wxNavigationKeyEvent_IsWindowChange 2861 -#define wxNavigationKeyEvent_SetWindowChange 2862 -#define wxNavigationKeyEvent_IsFromTab 2863 -#define wxNavigationKeyEvent_SetFromTab 2864 -#define wxNavigationKeyEvent_GetCurrentFocus 2865 -#define wxNavigationKeyEvent_SetCurrentFocus 2866 -#define wxHelpEvent_GetOrigin 2867 -#define wxHelpEvent_GetPosition 2868 -#define wxHelpEvent_SetOrigin 2869 -#define wxHelpEvent_SetPosition 2870 -#define wxContextMenuEvent_GetPosition 2871 -#define wxContextMenuEvent_SetPosition 2872 -#define wxIdleEvent_CanSend 2873 -#define wxIdleEvent_GetMode 2874 -#define wxIdleEvent_RequestMore 2875 -#define wxIdleEvent_MoreRequested 2876 -#define wxIdleEvent_SetMode 2877 -#define wxGridEvent_AltDown 2878 -#define wxGridEvent_ControlDown 2879 -#define wxGridEvent_GetCol 2880 -#define wxGridEvent_GetPosition 2881 -#define wxGridEvent_GetRow 2882 -#define wxGridEvent_MetaDown 2883 -#define wxGridEvent_Selecting 2884 -#define wxGridEvent_ShiftDown 2885 -#define wxNotifyEvent_Allow 2886 -#define wxNotifyEvent_IsAllowed 2887 -#define wxNotifyEvent_Veto 2888 -#define wxSashEvent_GetEdge 2889 -#define wxSashEvent_GetDragRect 2890 -#define wxSashEvent_GetDragStatus 2891 -#define wxListEvent_GetCacheFrom 2892 -#define wxListEvent_GetCacheTo 2893 -#define wxListEvent_GetKeyCode 2894 -#define wxListEvent_GetIndex 2895 -#define wxListEvent_GetColumn 2896 -#define wxListEvent_GetPoint 2897 -#define wxListEvent_GetLabel 2898 -#define wxListEvent_GetText 2899 -#define wxListEvent_GetImage 2900 -#define wxListEvent_GetData 2901 -#define wxListEvent_GetMask 2902 -#define wxListEvent_GetItem 2903 -#define wxListEvent_IsEditCancelled 2904 -#define wxDateEvent_GetDate 2905 -#define wxCalendarEvent_GetWeekDay 2906 -#define wxFileDirPickerEvent_GetPath 2907 -#define wxColourPickerEvent_GetColour 2908 -#define wxFontPickerEvent_GetFont 2909 -#define wxStyledTextEvent_GetPosition 2910 -#define wxStyledTextEvent_GetKey 2911 -#define wxStyledTextEvent_GetModifiers 2912 -#define wxStyledTextEvent_GetModificationType 2913 -#define wxStyledTextEvent_GetText 2914 -#define wxStyledTextEvent_GetLength 2915 -#define wxStyledTextEvent_GetLinesAdded 2916 -#define wxStyledTextEvent_GetLine 2917 -#define wxStyledTextEvent_GetFoldLevelNow 2918 -#define wxStyledTextEvent_GetFoldLevelPrev 2919 -#define wxStyledTextEvent_GetMargin 2920 -#define wxStyledTextEvent_GetMessage 2921 -#define wxStyledTextEvent_GetWParam 2922 -#define wxStyledTextEvent_GetLParam 2923 -#define wxStyledTextEvent_GetListType 2924 -#define wxStyledTextEvent_GetX 2925 -#define wxStyledTextEvent_GetY 2926 -#define wxStyledTextEvent_GetDragText 2927 -#define wxStyledTextEvent_GetDragAllowMove 2928 -#define wxStyledTextEvent_GetDragResult 2929 -#define wxStyledTextEvent_GetShift 2930 -#define wxStyledTextEvent_GetControl 2931 -#define wxStyledTextEvent_GetAlt 2932 -#define utils_wxGetKeyState 2933 -#define utils_wxGetMousePosition 2934 -#define utils_wxGetMouseState 2935 -#define utils_wxSetDetectableAutoRepeat 2936 -#define utils_wxBell 2937 -#define utils_wxFindMenuItemId 2938 -#define utils_wxGenericFindWindowAtPoint 2939 -#define utils_wxFindWindowAtPoint 2940 -#define utils_wxBeginBusyCursor 2941 -#define utils_wxEndBusyCursor 2942 -#define utils_wxIsBusy 2943 -#define utils_wxShutdown 2944 -#define utils_wxShell 2945 -#define utils_wxLaunchDefaultBrowser 2946 -#define utils_wxGetEmailAddress 2947 -#define utils_wxGetUserId 2948 -#define utils_wxGetHomeDir 2949 -#define utils_wxNewId 2950 -#define utils_wxRegisterId 2951 -#define utils_wxGetCurrentId 2952 -#define utils_wxGetOsDescription 2953 -#define utils_wxIsPlatformLittleEndian 2954 -#define utils_wxIsPlatform64Bit 2955 -#define gdicmn_wxDisplaySize 2956 -#define gdicmn_wxSetCursor 2957 -#define wxPrintout_new 2958 -#define wxPrintout_destruct 2959 -#define wxPrintout_GetDC 2960 -#define wxPrintout_GetPageSizeMM 2961 -#define wxPrintout_GetPageSizePixels 2962 -#define wxPrintout_GetPaperRectPixels 2963 -#define wxPrintout_GetPPIPrinter 2964 -#define wxPrintout_GetPPIScreen 2965 -#define wxPrintout_GetTitle 2966 -#define wxPrintout_IsPreview 2967 -#define wxPrintout_FitThisSizeToPaper 2968 -#define wxPrintout_FitThisSizeToPage 2969 -#define wxPrintout_FitThisSizeToPageMargins 2970 -#define wxPrintout_MapScreenSizeToPaper 2971 -#define wxPrintout_MapScreenSizeToPage 2972 -#define wxPrintout_MapScreenSizeToPageMargins 2973 -#define wxPrintout_MapScreenSizeToDevice 2974 -#define wxPrintout_GetLogicalPaperRect 2975 -#define wxPrintout_GetLogicalPageRect 2976 -#define wxPrintout_GetLogicalPageMarginsRect 2977 -#define wxPrintout_SetLogicalOrigin 2978 -#define wxPrintout_OffsetLogicalOrigin 2979 -#define wxStyledTextCtrl_new_2 2980 -#define wxStyledTextCtrl_new_0 2981 -#define wxStyledTextCtrl_destruct 2982 -#define wxStyledTextCtrl_Create 2983 -#define wxStyledTextCtrl_AddText 2984 -#define wxStyledTextCtrl_AddStyledText 2985 -#define wxStyledTextCtrl_InsertText 2986 -#define wxStyledTextCtrl_ClearAll 2987 -#define wxStyledTextCtrl_ClearDocumentStyle 2988 -#define wxStyledTextCtrl_GetLength 2989 -#define wxStyledTextCtrl_GetCharAt 2990 -#define wxStyledTextCtrl_GetCurrentPos 2991 -#define wxStyledTextCtrl_GetAnchor 2992 -#define wxStyledTextCtrl_GetStyleAt 2993 -#define wxStyledTextCtrl_Redo 2994 -#define wxStyledTextCtrl_SetUndoCollection 2995 -#define wxStyledTextCtrl_SelectAll 2996 -#define wxStyledTextCtrl_SetSavePoint 2997 -#define wxStyledTextCtrl_GetStyledText 2998 -#define wxStyledTextCtrl_CanRedo 2999 -#define wxStyledTextCtrl_MarkerLineFromHandle 3000 -#define wxStyledTextCtrl_MarkerDeleteHandle 3001 -#define wxStyledTextCtrl_GetUndoCollection 3002 -#define wxStyledTextCtrl_GetViewWhiteSpace 3003 -#define wxStyledTextCtrl_SetViewWhiteSpace 3004 -#define wxStyledTextCtrl_PositionFromPoint 3005 -#define wxStyledTextCtrl_PositionFromPointClose 3006 -#define wxStyledTextCtrl_GotoLine 3007 -#define wxStyledTextCtrl_GotoPos 3008 -#define wxStyledTextCtrl_SetAnchor 3009 -#define wxStyledTextCtrl_GetCurLine 3010 -#define wxStyledTextCtrl_GetEndStyled 3011 -#define wxStyledTextCtrl_ConvertEOLs 3012 -#define wxStyledTextCtrl_GetEOLMode 3013 -#define wxStyledTextCtrl_SetEOLMode 3014 -#define wxStyledTextCtrl_StartStyling 3015 -#define wxStyledTextCtrl_SetStyling 3016 -#define wxStyledTextCtrl_GetBufferedDraw 3017 -#define wxStyledTextCtrl_SetBufferedDraw 3018 -#define wxStyledTextCtrl_SetTabWidth 3019 -#define wxStyledTextCtrl_GetTabWidth 3020 -#define wxStyledTextCtrl_SetCodePage 3021 -#define wxStyledTextCtrl_MarkerDefine 3022 -#define wxStyledTextCtrl_MarkerSetForeground 3023 -#define wxStyledTextCtrl_MarkerSetBackground 3024 -#define wxStyledTextCtrl_MarkerAdd 3025 -#define wxStyledTextCtrl_MarkerDelete 3026 -#define wxStyledTextCtrl_MarkerDeleteAll 3027 -#define wxStyledTextCtrl_MarkerGet 3028 -#define wxStyledTextCtrl_MarkerNext 3029 -#define wxStyledTextCtrl_MarkerPrevious 3030 -#define wxStyledTextCtrl_MarkerDefineBitmap 3031 -#define wxStyledTextCtrl_MarkerAddSet 3032 -#define wxStyledTextCtrl_MarkerSetAlpha 3033 -#define wxStyledTextCtrl_SetMarginType 3034 -#define wxStyledTextCtrl_GetMarginType 3035 -#define wxStyledTextCtrl_SetMarginWidth 3036 -#define wxStyledTextCtrl_GetMarginWidth 3037 -#define wxStyledTextCtrl_SetMarginMask 3038 -#define wxStyledTextCtrl_GetMarginMask 3039 -#define wxStyledTextCtrl_SetMarginSensitive 3040 -#define wxStyledTextCtrl_GetMarginSensitive 3041 -#define wxStyledTextCtrl_StyleClearAll 3042 -#define wxStyledTextCtrl_StyleSetForeground 3043 -#define wxStyledTextCtrl_StyleSetBackground 3044 -#define wxStyledTextCtrl_StyleSetBold 3045 -#define wxStyledTextCtrl_StyleSetItalic 3046 -#define wxStyledTextCtrl_StyleSetSize 3047 -#define wxStyledTextCtrl_StyleSetFaceName 3048 -#define wxStyledTextCtrl_StyleSetEOLFilled 3049 -#define wxStyledTextCtrl_StyleResetDefault 3050 -#define wxStyledTextCtrl_StyleSetUnderline 3051 -#define wxStyledTextCtrl_StyleSetCase 3052 -#define wxStyledTextCtrl_StyleSetHotSpot 3053 -#define wxStyledTextCtrl_SetSelForeground 3054 -#define wxStyledTextCtrl_SetSelBackground 3055 -#define wxStyledTextCtrl_GetSelAlpha 3056 -#define wxStyledTextCtrl_SetSelAlpha 3057 -#define wxStyledTextCtrl_SetCaretForeground 3058 -#define wxStyledTextCtrl_CmdKeyAssign 3059 -#define wxStyledTextCtrl_CmdKeyClear 3060 -#define wxStyledTextCtrl_CmdKeyClearAll 3061 -#define wxStyledTextCtrl_SetStyleBytes 3062 -#define wxStyledTextCtrl_StyleSetVisible 3063 -#define wxStyledTextCtrl_GetCaretPeriod 3064 -#define wxStyledTextCtrl_SetCaretPeriod 3065 -#define wxStyledTextCtrl_SetWordChars 3066 -#define wxStyledTextCtrl_BeginUndoAction 3067 -#define wxStyledTextCtrl_EndUndoAction 3068 -#define wxStyledTextCtrl_IndicatorSetStyle 3069 -#define wxStyledTextCtrl_IndicatorGetStyle 3070 -#define wxStyledTextCtrl_IndicatorSetForeground 3071 -#define wxStyledTextCtrl_IndicatorGetForeground 3072 -#define wxStyledTextCtrl_SetWhitespaceForeground 3073 -#define wxStyledTextCtrl_SetWhitespaceBackground 3074 -#define wxStyledTextCtrl_GetStyleBits 3075 -#define wxStyledTextCtrl_SetLineState 3076 -#define wxStyledTextCtrl_GetLineState 3077 -#define wxStyledTextCtrl_GetMaxLineState 3078 -#define wxStyledTextCtrl_GetCaretLineVisible 3079 -#define wxStyledTextCtrl_SetCaretLineVisible 3080 -#define wxStyledTextCtrl_GetCaretLineBackground 3081 -#define wxStyledTextCtrl_SetCaretLineBackground 3082 -#define wxStyledTextCtrl_AutoCompShow 3083 -#define wxStyledTextCtrl_AutoCompCancel 3084 -#define wxStyledTextCtrl_AutoCompActive 3085 -#define wxStyledTextCtrl_AutoCompPosStart 3086 -#define wxStyledTextCtrl_AutoCompComplete 3087 -#define wxStyledTextCtrl_AutoCompStops 3088 -#define wxStyledTextCtrl_AutoCompSetSeparator 3089 -#define wxStyledTextCtrl_AutoCompGetSeparator 3090 -#define wxStyledTextCtrl_AutoCompSelect 3091 -#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3092 -#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3093 -#define wxStyledTextCtrl_AutoCompSetFillUps 3094 -#define wxStyledTextCtrl_AutoCompSetChooseSingle 3095 -#define wxStyledTextCtrl_AutoCompGetChooseSingle 3096 -#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3097 -#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3098 -#define wxStyledTextCtrl_UserListShow 3099 -#define wxStyledTextCtrl_AutoCompSetAutoHide 3100 -#define wxStyledTextCtrl_AutoCompGetAutoHide 3101 -#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3102 -#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3103 -#define wxStyledTextCtrl_RegisterImage 3104 -#define wxStyledTextCtrl_ClearRegisteredImages 3105 -#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3106 -#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3107 -#define wxStyledTextCtrl_AutoCompSetMaxWidth 3108 -#define wxStyledTextCtrl_AutoCompGetMaxWidth 3109 -#define wxStyledTextCtrl_AutoCompSetMaxHeight 3110 -#define wxStyledTextCtrl_AutoCompGetMaxHeight 3111 -#define wxStyledTextCtrl_SetIndent 3112 -#define wxStyledTextCtrl_GetIndent 3113 -#define wxStyledTextCtrl_SetUseTabs 3114 -#define wxStyledTextCtrl_GetUseTabs 3115 -#define wxStyledTextCtrl_SetLineIndentation 3116 -#define wxStyledTextCtrl_GetLineIndentation 3117 -#define wxStyledTextCtrl_GetLineIndentPosition 3118 -#define wxStyledTextCtrl_GetColumn 3119 -#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3120 -#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3121 -#define wxStyledTextCtrl_SetIndentationGuides 3122 -#define wxStyledTextCtrl_GetIndentationGuides 3123 -#define wxStyledTextCtrl_SetHighlightGuide 3124 -#define wxStyledTextCtrl_GetHighlightGuide 3125 -#define wxStyledTextCtrl_GetLineEndPosition 3126 -#define wxStyledTextCtrl_GetCodePage 3127 -#define wxStyledTextCtrl_GetCaretForeground 3128 -#define wxStyledTextCtrl_GetReadOnly 3129 -#define wxStyledTextCtrl_SetCurrentPos 3130 -#define wxStyledTextCtrl_SetSelectionStart 3131 -#define wxStyledTextCtrl_GetSelectionStart 3132 -#define wxStyledTextCtrl_SetSelectionEnd 3133 -#define wxStyledTextCtrl_GetSelectionEnd 3134 -#define wxStyledTextCtrl_SetPrintMagnification 3135 -#define wxStyledTextCtrl_GetPrintMagnification 3136 -#define wxStyledTextCtrl_SetPrintColourMode 3137 -#define wxStyledTextCtrl_GetPrintColourMode 3138 -#define wxStyledTextCtrl_FindText 3139 -#define wxStyledTextCtrl_FormatRange 3140 -#define wxStyledTextCtrl_GetFirstVisibleLine 3141 -#define wxStyledTextCtrl_GetLine 3142 -#define wxStyledTextCtrl_GetLineCount 3143 -#define wxStyledTextCtrl_SetMarginLeft 3144 -#define wxStyledTextCtrl_GetMarginLeft 3145 -#define wxStyledTextCtrl_SetMarginRight 3146 -#define wxStyledTextCtrl_GetMarginRight 3147 -#define wxStyledTextCtrl_GetModify 3148 -#define wxStyledTextCtrl_SetSelection 3149 -#define wxStyledTextCtrl_GetSelectedText 3150 -#define wxStyledTextCtrl_GetTextRange 3151 -#define wxStyledTextCtrl_HideSelection 3152 -#define wxStyledTextCtrl_LineFromPosition 3153 -#define wxStyledTextCtrl_PositionFromLine 3154 -#define wxStyledTextCtrl_LineScroll 3155 -#define wxStyledTextCtrl_EnsureCaretVisible 3156 -#define wxStyledTextCtrl_ReplaceSelection 3157 -#define wxStyledTextCtrl_SetReadOnly 3158 -#define wxStyledTextCtrl_CanPaste 3159 -#define wxStyledTextCtrl_CanUndo 3160 -#define wxStyledTextCtrl_EmptyUndoBuffer 3161 -#define wxStyledTextCtrl_Undo 3162 -#define wxStyledTextCtrl_Cut 3163 -#define wxStyledTextCtrl_Copy 3164 -#define wxStyledTextCtrl_Paste 3165 -#define wxStyledTextCtrl_Clear 3166 -#define wxStyledTextCtrl_SetText 3167 -#define wxStyledTextCtrl_GetText 3168 -#define wxStyledTextCtrl_GetTextLength 3169 -#define wxStyledTextCtrl_GetOvertype 3170 -#define wxStyledTextCtrl_SetCaretWidth 3171 -#define wxStyledTextCtrl_GetCaretWidth 3172 -#define wxStyledTextCtrl_SetTargetStart 3173 -#define wxStyledTextCtrl_GetTargetStart 3174 -#define wxStyledTextCtrl_SetTargetEnd 3175 -#define wxStyledTextCtrl_GetTargetEnd 3176 -#define wxStyledTextCtrl_ReplaceTarget 3177 -#define wxStyledTextCtrl_SearchInTarget 3178 -#define wxStyledTextCtrl_SetSearchFlags 3179 -#define wxStyledTextCtrl_GetSearchFlags 3180 -#define wxStyledTextCtrl_CallTipShow 3181 -#define wxStyledTextCtrl_CallTipCancel 3182 -#define wxStyledTextCtrl_CallTipActive 3183 -#define wxStyledTextCtrl_CallTipPosAtStart 3184 -#define wxStyledTextCtrl_CallTipSetHighlight 3185 -#define wxStyledTextCtrl_CallTipSetBackground 3186 -#define wxStyledTextCtrl_CallTipSetForeground 3187 -#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3188 -#define wxStyledTextCtrl_CallTipUseStyle 3189 -#define wxStyledTextCtrl_VisibleFromDocLine 3190 -#define wxStyledTextCtrl_DocLineFromVisible 3191 -#define wxStyledTextCtrl_WrapCount 3192 -#define wxStyledTextCtrl_SetFoldLevel 3193 -#define wxStyledTextCtrl_GetFoldLevel 3194 -#define wxStyledTextCtrl_GetLastChild 3195 -#define wxStyledTextCtrl_GetFoldParent 3196 -#define wxStyledTextCtrl_ShowLines 3197 -#define wxStyledTextCtrl_HideLines 3198 -#define wxStyledTextCtrl_GetLineVisible 3199 -#define wxStyledTextCtrl_SetFoldExpanded 3200 -#define wxStyledTextCtrl_GetFoldExpanded 3201 -#define wxStyledTextCtrl_ToggleFold 3202 -#define wxStyledTextCtrl_EnsureVisible 3203 -#define wxStyledTextCtrl_SetFoldFlags 3204 -#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3205 -#define wxStyledTextCtrl_SetTabIndents 3206 -#define wxStyledTextCtrl_GetTabIndents 3207 -#define wxStyledTextCtrl_SetBackSpaceUnIndents 3208 -#define wxStyledTextCtrl_GetBackSpaceUnIndents 3209 -#define wxStyledTextCtrl_SetMouseDwellTime 3210 -#define wxStyledTextCtrl_GetMouseDwellTime 3211 -#define wxStyledTextCtrl_WordStartPosition 3212 -#define wxStyledTextCtrl_WordEndPosition 3213 -#define wxStyledTextCtrl_SetWrapMode 3214 -#define wxStyledTextCtrl_GetWrapMode 3215 -#define wxStyledTextCtrl_SetWrapVisualFlags 3216 -#define wxStyledTextCtrl_GetWrapVisualFlags 3217 -#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3218 -#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3219 -#define wxStyledTextCtrl_SetWrapStartIndent 3220 -#define wxStyledTextCtrl_GetWrapStartIndent 3221 -#define wxStyledTextCtrl_SetLayoutCache 3222 -#define wxStyledTextCtrl_GetLayoutCache 3223 -#define wxStyledTextCtrl_SetScrollWidth 3224 -#define wxStyledTextCtrl_GetScrollWidth 3225 -#define wxStyledTextCtrl_TextWidth 3226 -#define wxStyledTextCtrl_GetEndAtLastLine 3227 -#define wxStyledTextCtrl_TextHeight 3228 -#define wxStyledTextCtrl_SetUseVerticalScrollBar 3229 -#define wxStyledTextCtrl_GetUseVerticalScrollBar 3230 -#define wxStyledTextCtrl_AppendText 3231 -#define wxStyledTextCtrl_GetTwoPhaseDraw 3232 -#define wxStyledTextCtrl_SetTwoPhaseDraw 3233 -#define wxStyledTextCtrl_TargetFromSelection 3234 -#define wxStyledTextCtrl_LinesJoin 3235 -#define wxStyledTextCtrl_LinesSplit 3236 -#define wxStyledTextCtrl_SetFoldMarginColour 3237 -#define wxStyledTextCtrl_SetFoldMarginHiColour 3238 -#define wxStyledTextCtrl_LineDown 3239 -#define wxStyledTextCtrl_LineDownExtend 3240 -#define wxStyledTextCtrl_LineUp 3241 -#define wxStyledTextCtrl_LineUpExtend 3242 -#define wxStyledTextCtrl_CharLeft 3243 -#define wxStyledTextCtrl_CharLeftExtend 3244 -#define wxStyledTextCtrl_CharRight 3245 -#define wxStyledTextCtrl_CharRightExtend 3246 -#define wxStyledTextCtrl_WordLeft 3247 -#define wxStyledTextCtrl_WordLeftExtend 3248 -#define wxStyledTextCtrl_WordRight 3249 -#define wxStyledTextCtrl_WordRightExtend 3250 -#define wxStyledTextCtrl_Home 3251 -#define wxStyledTextCtrl_HomeExtend 3252 -#define wxStyledTextCtrl_LineEnd 3253 -#define wxStyledTextCtrl_LineEndExtend 3254 -#define wxStyledTextCtrl_DocumentStart 3255 -#define wxStyledTextCtrl_DocumentStartExtend 3256 -#define wxStyledTextCtrl_DocumentEnd 3257 -#define wxStyledTextCtrl_DocumentEndExtend 3258 -#define wxStyledTextCtrl_PageUp 3259 -#define wxStyledTextCtrl_PageUpExtend 3260 -#define wxStyledTextCtrl_PageDown 3261 -#define wxStyledTextCtrl_PageDownExtend 3262 -#define wxStyledTextCtrl_EditToggleOvertype 3263 -#define wxStyledTextCtrl_Cancel 3264 -#define wxStyledTextCtrl_DeleteBack 3265 -#define wxStyledTextCtrl_Tab 3266 -#define wxStyledTextCtrl_BackTab 3267 -#define wxStyledTextCtrl_NewLine 3268 -#define wxStyledTextCtrl_FormFeed 3269 -#define wxStyledTextCtrl_VCHome 3270 -#define wxStyledTextCtrl_VCHomeExtend 3271 -#define wxStyledTextCtrl_ZoomIn 3272 -#define wxStyledTextCtrl_ZoomOut 3273 -#define wxStyledTextCtrl_DelWordLeft 3274 -#define wxStyledTextCtrl_DelWordRight 3275 -#define wxStyledTextCtrl_LineCut 3276 -#define wxStyledTextCtrl_LineDelete 3277 -#define wxStyledTextCtrl_LineTranspose 3278 -#define wxStyledTextCtrl_LineDuplicate 3279 -#define wxStyledTextCtrl_LowerCase 3280 -#define wxStyledTextCtrl_UpperCase 3281 -#define wxStyledTextCtrl_LineScrollDown 3282 -#define wxStyledTextCtrl_LineScrollUp 3283 -#define wxStyledTextCtrl_DeleteBackNotLine 3284 -#define wxStyledTextCtrl_HomeDisplay 3285 -#define wxStyledTextCtrl_HomeDisplayExtend 3286 -#define wxStyledTextCtrl_LineEndDisplay 3287 -#define wxStyledTextCtrl_LineEndDisplayExtend 3288 -#define wxStyledTextCtrl_HomeWrapExtend 3289 -#define wxStyledTextCtrl_LineEndWrap 3290 -#define wxStyledTextCtrl_LineEndWrapExtend 3291 -#define wxStyledTextCtrl_VCHomeWrap 3292 -#define wxStyledTextCtrl_VCHomeWrapExtend 3293 -#define wxStyledTextCtrl_LineCopy 3294 -#define wxStyledTextCtrl_MoveCaretInsideView 3295 -#define wxStyledTextCtrl_LineLength 3296 -#define wxStyledTextCtrl_BraceHighlight 3297 -#define wxStyledTextCtrl_BraceBadLight 3298 -#define wxStyledTextCtrl_BraceMatch 3299 -#define wxStyledTextCtrl_GetViewEOL 3300 -#define wxStyledTextCtrl_SetViewEOL 3301 -#define wxStyledTextCtrl_SetModEventMask 3302 -#define wxStyledTextCtrl_GetEdgeColumn 3303 -#define wxStyledTextCtrl_SetEdgeColumn 3304 -#define wxStyledTextCtrl_SetEdgeMode 3305 -#define wxStyledTextCtrl_GetEdgeMode 3306 -#define wxStyledTextCtrl_GetEdgeColour 3307 -#define wxStyledTextCtrl_SetEdgeColour 3308 -#define wxStyledTextCtrl_SearchAnchor 3309 -#define wxStyledTextCtrl_SearchNext 3310 -#define wxStyledTextCtrl_SearchPrev 3311 -#define wxStyledTextCtrl_LinesOnScreen 3312 -#define wxStyledTextCtrl_UsePopUp 3313 -#define wxStyledTextCtrl_SelectionIsRectangle 3314 -#define wxStyledTextCtrl_SetZoom 3315 -#define wxStyledTextCtrl_GetZoom 3316 -#define wxStyledTextCtrl_GetModEventMask 3317 -#define wxStyledTextCtrl_SetSTCFocus 3318 -#define wxStyledTextCtrl_GetSTCFocus 3319 -#define wxStyledTextCtrl_SetStatus 3320 -#define wxStyledTextCtrl_GetStatus 3321 -#define wxStyledTextCtrl_SetMouseDownCaptures 3322 -#define wxStyledTextCtrl_GetMouseDownCaptures 3323 -#define wxStyledTextCtrl_SetSTCCursor 3324 -#define wxStyledTextCtrl_GetSTCCursor 3325 -#define wxStyledTextCtrl_SetControlCharSymbol 3326 -#define wxStyledTextCtrl_GetControlCharSymbol 3327 -#define wxStyledTextCtrl_WordPartLeft 3328 -#define wxStyledTextCtrl_WordPartLeftExtend 3329 -#define wxStyledTextCtrl_WordPartRight 3330 -#define wxStyledTextCtrl_WordPartRightExtend 3331 -#define wxStyledTextCtrl_SetVisiblePolicy 3332 -#define wxStyledTextCtrl_DelLineLeft 3333 -#define wxStyledTextCtrl_DelLineRight 3334 -#define wxStyledTextCtrl_GetXOffset 3335 -#define wxStyledTextCtrl_ChooseCaretX 3336 -#define wxStyledTextCtrl_SetXCaretPolicy 3337 -#define wxStyledTextCtrl_SetYCaretPolicy 3338 -#define wxStyledTextCtrl_GetPrintWrapMode 3339 -#define wxStyledTextCtrl_SetHotspotActiveForeground 3340 -#define wxStyledTextCtrl_SetHotspotActiveBackground 3341 -#define wxStyledTextCtrl_SetHotspotActiveUnderline 3342 -#define wxStyledTextCtrl_SetHotspotSingleLine 3343 -#define wxStyledTextCtrl_ParaDownExtend 3344 -#define wxStyledTextCtrl_ParaUp 3345 -#define wxStyledTextCtrl_ParaUpExtend 3346 -#define wxStyledTextCtrl_PositionBefore 3347 -#define wxStyledTextCtrl_PositionAfter 3348 -#define wxStyledTextCtrl_CopyRange 3349 -#define wxStyledTextCtrl_CopyText 3350 -#define wxStyledTextCtrl_SetSelectionMode 3351 -#define wxStyledTextCtrl_GetSelectionMode 3352 -#define wxStyledTextCtrl_LineDownRectExtend 3353 -#define wxStyledTextCtrl_LineUpRectExtend 3354 -#define wxStyledTextCtrl_CharLeftRectExtend 3355 -#define wxStyledTextCtrl_CharRightRectExtend 3356 -#define wxStyledTextCtrl_HomeRectExtend 3357 -#define wxStyledTextCtrl_VCHomeRectExtend 3358 -#define wxStyledTextCtrl_LineEndRectExtend 3359 -#define wxStyledTextCtrl_PageUpRectExtend 3360 -#define wxStyledTextCtrl_PageDownRectExtend 3361 -#define wxStyledTextCtrl_StutteredPageUp 3362 -#define wxStyledTextCtrl_StutteredPageUpExtend 3363 -#define wxStyledTextCtrl_StutteredPageDown 3364 -#define wxStyledTextCtrl_StutteredPageDownExtend 3365 -#define wxStyledTextCtrl_WordLeftEnd 3366 -#define wxStyledTextCtrl_WordLeftEndExtend 3367 -#define wxStyledTextCtrl_WordRightEnd 3368 -#define wxStyledTextCtrl_WordRightEndExtend 3369 -#define wxStyledTextCtrl_SetWhitespaceChars 3370 -#define wxStyledTextCtrl_SetCharsDefault 3371 -#define wxStyledTextCtrl_AutoCompGetCurrent 3372 -#define wxStyledTextCtrl_Allocate 3373 -#define wxStyledTextCtrl_FindColumn 3374 -#define wxStyledTextCtrl_GetCaretSticky 3375 -#define wxStyledTextCtrl_SetCaretSticky 3376 -#define wxStyledTextCtrl_ToggleCaretSticky 3377 -#define wxStyledTextCtrl_SetPasteConvertEndings 3378 -#define wxStyledTextCtrl_GetPasteConvertEndings 3379 -#define wxStyledTextCtrl_SelectionDuplicate 3380 -#define wxStyledTextCtrl_SetCaretLineBackAlpha 3381 -#define wxStyledTextCtrl_GetCaretLineBackAlpha 3382 -#define wxStyledTextCtrl_StartRecord 3383 -#define wxStyledTextCtrl_StopRecord 3384 -#define wxStyledTextCtrl_SetLexer 3385 -#define wxStyledTextCtrl_GetLexer 3386 -#define wxStyledTextCtrl_Colourise 3387 -#define wxStyledTextCtrl_SetProperty 3388 -#define wxStyledTextCtrl_SetKeyWords 3389 -#define wxStyledTextCtrl_SetLexerLanguage 3390 -#define wxStyledTextCtrl_GetProperty 3391 -#define wxStyledTextCtrl_GetStyleBitsNeeded 3392 -#define wxStyledTextCtrl_GetCurrentLine 3393 -#define wxStyledTextCtrl_StyleSetSpec 3394 -#define wxStyledTextCtrl_StyleSetFont 3395 -#define wxStyledTextCtrl_StyleSetFontAttr 3396 -#define wxStyledTextCtrl_StyleSetCharacterSet 3397 -#define wxStyledTextCtrl_StyleSetFontEncoding 3398 -#define wxStyledTextCtrl_CmdKeyExecute 3399 -#define wxStyledTextCtrl_SetMargins 3400 -#define wxStyledTextCtrl_GetSelection 3401 -#define wxStyledTextCtrl_PointFromPosition 3402 -#define wxStyledTextCtrl_ScrollToLine 3403 -#define wxStyledTextCtrl_ScrollToColumn 3404 -#define wxStyledTextCtrl_SetVScrollBar 3405 -#define wxStyledTextCtrl_SetHScrollBar 3406 -#define wxStyledTextCtrl_GetLastKeydownProcessed 3407 -#define wxStyledTextCtrl_SetLastKeydownProcessed 3408 -#define wxStyledTextCtrl_SaveFile 3409 -#define wxStyledTextCtrl_LoadFile 3410 -#define wxStyledTextCtrl_DoDragOver 3411 -#define wxStyledTextCtrl_DoDropText 3412 -#define wxStyledTextCtrl_GetUseAntiAliasing 3413 -#define wxStyledTextCtrl_AddTextRaw 3414 -#define wxStyledTextCtrl_InsertTextRaw 3415 -#define wxStyledTextCtrl_GetCurLineRaw 3416 -#define wxStyledTextCtrl_GetLineRaw 3417 -#define wxStyledTextCtrl_GetSelectedTextRaw 3418 -#define wxStyledTextCtrl_GetTextRangeRaw 3419 -#define wxStyledTextCtrl_SetTextRaw 3420 -#define wxStyledTextCtrl_GetTextRaw 3421 -#define wxStyledTextCtrl_AppendTextRaw 3422 -#define wxArtProvider_GetBitmap 3423 -#define wxArtProvider_GetIcon 3424 -#define wxTreeEvent_GetKeyCode 3425 -#define wxTreeEvent_GetItem 3426 -#define wxTreeEvent_GetKeyEvent 3427 -#define wxTreeEvent_GetLabel 3428 -#define wxTreeEvent_GetOldItem 3429 -#define wxTreeEvent_GetPoint 3430 -#define wxTreeEvent_IsEditCancelled 3431 -#define wxTreeEvent_SetToolTip 3432 -#define wxNotebookEvent_GetOldSelection 3433 -#define wxNotebookEvent_GetSelection 3434 -#define wxNotebookEvent_SetOldSelection 3435 -#define wxNotebookEvent_SetSelection 3436 -#define wxFileDataObject_new 3437 -#define wxFileDataObject_AddFile 3438 -#define wxFileDataObject_GetFilenames 3439 -#define wxFileDataObject_destroy 3440 -#define wxTextDataObject_new 3441 -#define wxTextDataObject_GetTextLength 3442 -#define wxTextDataObject_GetText 3443 -#define wxTextDataObject_SetText 3444 -#define wxTextDataObject_destroy 3445 -#define wxBitmapDataObject_new_1_1 3446 -#define wxBitmapDataObject_new_1_0 3447 -#define wxBitmapDataObject_GetBitmap 3448 -#define wxBitmapDataObject_SetBitmap 3449 -#define wxBitmapDataObject_destroy 3450 -#define wxClipboard_new 3452 -#define wxClipboard_destruct 3453 -#define wxClipboard_AddData 3454 -#define wxClipboard_Clear 3455 -#define wxClipboard_Close 3456 -#define wxClipboard_Flush 3457 -#define wxClipboard_GetData 3458 -#define wxClipboard_IsOpened 3459 -#define wxClipboard_Open 3460 -#define wxClipboard_SetData 3461 -#define wxClipboard_UsePrimarySelection 3463 -#define wxClipboard_IsSupported 3464 -#define wxClipboard_Get 3465 -#define wxSpinEvent_GetPosition 3466 -#define wxSpinEvent_SetPosition 3467 -#define wxSplitterWindow_new_0 3468 -#define wxSplitterWindow_new_2 3469 -#define wxSplitterWindow_destruct 3470 -#define wxSplitterWindow_Create 3471 -#define wxSplitterWindow_GetMinimumPaneSize 3472 -#define wxSplitterWindow_GetSashGravity 3473 -#define wxSplitterWindow_GetSashPosition 3474 -#define wxSplitterWindow_GetSplitMode 3475 -#define wxSplitterWindow_GetWindow1 3476 -#define wxSplitterWindow_GetWindow2 3477 -#define wxSplitterWindow_Initialize 3478 -#define wxSplitterWindow_IsSplit 3479 -#define wxSplitterWindow_ReplaceWindow 3480 -#define wxSplitterWindow_SetSashGravity 3481 -#define wxSplitterWindow_SetSashPosition 3482 -#define wxSplitterWindow_SetSashSize 3483 -#define wxSplitterWindow_SetMinimumPaneSize 3484 -#define wxSplitterWindow_SetSplitMode 3485 -#define wxSplitterWindow_SplitHorizontally 3486 -#define wxSplitterWindow_SplitVertically 3487 -#define wxSplitterWindow_Unsplit 3488 -#define wxSplitterWindow_UpdateSize 3489 -#define wxSplitterEvent_GetSashPosition 3490 -#define wxSplitterEvent_GetX 3491 -#define wxSplitterEvent_GetY 3492 -#define wxSplitterEvent_GetWindowBeingRemoved 3493 -#define wxSplitterEvent_SetSashPosition 3494 -#define wxHtmlWindow_new_0 3495 -#define wxHtmlWindow_new_2 3496 -#define wxHtmlWindow_AppendToPage 3497 -#define wxHtmlWindow_GetOpenedAnchor 3498 -#define wxHtmlWindow_GetOpenedPage 3499 -#define wxHtmlWindow_GetOpenedPageTitle 3500 -#define wxHtmlWindow_GetRelatedFrame 3501 -#define wxHtmlWindow_HistoryBack 3502 -#define wxHtmlWindow_HistoryCanBack 3503 -#define wxHtmlWindow_HistoryCanForward 3504 -#define wxHtmlWindow_HistoryClear 3505 -#define wxHtmlWindow_HistoryForward 3506 -#define wxHtmlWindow_LoadFile 3507 -#define wxHtmlWindow_LoadPage 3508 -#define wxHtmlWindow_SelectAll 3509 -#define wxHtmlWindow_SelectionToText 3510 -#define wxHtmlWindow_SelectLine 3511 -#define wxHtmlWindow_SelectWord 3512 -#define wxHtmlWindow_SetBorders 3513 -#define wxHtmlWindow_SetFonts 3514 -#define wxHtmlWindow_SetPage 3515 -#define wxHtmlWindow_SetRelatedFrame 3516 -#define wxHtmlWindow_SetRelatedStatusBar 3517 -#define wxHtmlWindow_ToText 3518 -#define wxHtmlWindow_destroy 3519 -#define wxHtmlLinkEvent_GetLinkInfo 3520 -#define wxSystemSettings_GetColour 3521 -#define wxSystemSettings_GetFont 3522 -#define wxSystemSettings_GetMetric 3523 -#define wxSystemSettings_GetScreenType 3524 -#define wxSystemOptions_GetOption 3525 -#define wxSystemOptions_GetOptionInt 3526 -#define wxSystemOptions_HasOption 3527 -#define wxSystemOptions_IsFalse 3528 -#define wxSystemOptions_SetOption_2_1 3529 -#define wxSystemOptions_SetOption_2_0 3530 -#define wxAuiNotebookEvent_SetSelection 3531 -#define wxAuiNotebookEvent_GetSelection 3532 -#define wxAuiNotebookEvent_SetOldSelection 3533 -#define wxAuiNotebookEvent_GetOldSelection 3534 -#define wxAuiNotebookEvent_SetDragSource 3535 -#define wxAuiNotebookEvent_GetDragSource 3536 -#define wxAuiManagerEvent_SetManager 3537 -#define wxAuiManagerEvent_GetManager 3538 -#define wxAuiManagerEvent_SetPane 3539 -#define wxAuiManagerEvent_GetPane 3540 -#define wxAuiManagerEvent_SetButton 3541 -#define wxAuiManagerEvent_GetButton 3542 -#define wxAuiManagerEvent_SetDC 3543 -#define wxAuiManagerEvent_GetDC 3544 -#define wxAuiManagerEvent_Veto 3545 -#define wxAuiManagerEvent_GetVeto 3546 -#define wxAuiManagerEvent_SetCanVeto 3547 -#define wxAuiManagerEvent_CanVeto 3548 -#define wxLogNull_new 3549 -#define wxLogNull_destroy 3550 -#define wxTaskBarIcon_new 3551 -#define wxTaskBarIcon_destruct 3552 -#define wxTaskBarIcon_PopupMenu 3553 -#define wxTaskBarIcon_RemoveIcon 3554 -#define wxTaskBarIcon_SetIcon 3555 -#define wxLocale_new_0 3556 -#define wxLocale_new_2 3558 -#define wxLocale_destruct 3559 -#define wxLocale_Init 3561 -#define wxLocale_AddCatalog_1 3562 -#define wxLocale_AddCatalog_3 3563 -#define wxLocale_AddCatalogLookupPathPrefix 3564 -#define wxLocale_GetCanonicalName 3565 -#define wxLocale_GetLanguage 3566 -#define wxLocale_GetLanguageName 3567 -#define wxLocale_GetLocale 3568 -#define wxLocale_GetName 3569 -#define wxLocale_GetString_2 3570 -#define wxLocale_GetString_4 3571 -#define wxLocale_GetHeaderValue 3572 -#define wxLocale_GetSysName 3573 -#define wxLocale_GetSystemEncoding 3574 -#define wxLocale_GetSystemEncodingName 3575 -#define wxLocale_GetSystemLanguage 3576 -#define wxLocale_IsLoaded 3577 -#define wxLocale_IsOk 3578 -#define wxActivateEvent_GetActive 3579 -#define wxPopupWindow_new_2 3581 -#define wxPopupWindow_new_0 3582 -#define wxPopupWindow_destruct 3584 -#define wxPopupWindow_Create 3585 -#define wxPopupWindow_Position 3586 -#define wxPopupTransientWindow_new_0 3587 -#define wxPopupTransientWindow_new_2 3588 -#define wxPopupTransientWindow_destruct 3589 -#define wxPopupTransientWindow_Popup 3590 -#define wxPopupTransientWindow_Dismiss 3591 -#define wxOverlay_new 3592 -#define wxOverlay_destruct 3593 -#define wxOverlay_Reset 3594 -#define wxDCOverlay_new_6 3595 -#define wxDCOverlay_new_2 3596 -#define wxDCOverlay_destruct 3597 -#define wxDCOverlay_Clear 3598 +#define wxGauge_GetRange 1605 +#define wxGauge_GetValue 1606 +#define wxGauge_IsVertical 1607 +#define wxGauge_SetRange 1608 +#define wxGauge_SetValue 1609 +#define wxGauge_Pulse 1610 +#define wxGauge_destroy 1611 +#define wxGenericDirCtrl_new_0 1612 +#define wxGenericDirCtrl_new_2 1613 +#define wxGenericDirCtrl_destruct 1614 +#define wxGenericDirCtrl_Create 1615 +#define wxGenericDirCtrl_Init 1616 +#define wxGenericDirCtrl_CollapseTree 1617 +#define wxGenericDirCtrl_ExpandPath 1618 +#define wxGenericDirCtrl_GetDefaultPath 1619 +#define wxGenericDirCtrl_GetPath 1620 +#define wxGenericDirCtrl_GetFilePath 1621 +#define wxGenericDirCtrl_GetFilter 1622 +#define wxGenericDirCtrl_GetFilterIndex 1623 +#define wxGenericDirCtrl_GetRootId 1624 +#define wxGenericDirCtrl_GetTreeCtrl 1625 +#define wxGenericDirCtrl_ReCreateTree 1626 +#define wxGenericDirCtrl_SetDefaultPath 1627 +#define wxGenericDirCtrl_SetFilter 1628 +#define wxGenericDirCtrl_SetFilterIndex 1629 +#define wxGenericDirCtrl_SetPath 1630 +#define wxStaticBox_new_4 1632 +#define wxStaticBox_new_0 1633 +#define wxStaticBox_Create 1634 +#define wxStaticBox_destroy 1635 +#define wxStaticLine_new_2 1637 +#define wxStaticLine_new_0 1638 +#define wxStaticLine_Create 1639 +#define wxStaticLine_IsVertical 1640 +#define wxStaticLine_GetDefaultSize 1641 +#define wxStaticLine_destroy 1642 +#define wxListBox_new_3 1645 +#define wxListBox_new_0 1646 +#define wxListBox_destruct 1648 +#define wxListBox_Create 1650 +#define wxListBox_Deselect 1651 +#define wxListBox_GetSelections 1652 +#define wxListBox_InsertItems 1653 +#define wxListBox_IsSelected 1654 +#define wxListBox_Set 1655 +#define wxListBox_HitTest 1656 +#define wxListBox_SetFirstItem_1_0 1657 +#define wxListBox_SetFirstItem_1_1 1658 +#define wxListCtrl_new_0 1659 +#define wxListCtrl_new_2 1660 +#define wxListCtrl_Arrange 1661 +#define wxListCtrl_AssignImageList 1662 +#define wxListCtrl_ClearAll 1663 +#define wxListCtrl_Create 1664 +#define wxListCtrl_DeleteAllItems 1665 +#define wxListCtrl_DeleteColumn 1666 +#define wxListCtrl_DeleteItem 1667 +#define wxListCtrl_EditLabel 1668 +#define wxListCtrl_EnsureVisible 1669 +#define wxListCtrl_FindItem_3_0 1670 +#define wxListCtrl_FindItem_3_1 1671 +#define wxListCtrl_GetColumn 1672 +#define wxListCtrl_GetColumnCount 1673 +#define wxListCtrl_GetColumnWidth 1674 +#define wxListCtrl_GetCountPerPage 1675 +#define wxListCtrl_GetEditControl 1676 +#define wxListCtrl_GetImageList 1677 +#define wxListCtrl_GetItem 1678 +#define wxListCtrl_GetItemBackgroundColour 1679 +#define wxListCtrl_GetItemCount 1680 +#define wxListCtrl_GetItemData 1681 +#define wxListCtrl_GetItemFont 1682 +#define wxListCtrl_GetItemPosition 1683 +#define wxListCtrl_GetItemRect 1684 +#define wxListCtrl_GetItemSpacing 1685 +#define wxListCtrl_GetItemState 1686 +#define wxListCtrl_GetItemText 1687 +#define wxListCtrl_GetItemTextColour 1688 +#define wxListCtrl_GetNextItem 1689 +#define wxListCtrl_GetSelectedItemCount 1690 +#define wxListCtrl_GetTextColour 1691 +#define wxListCtrl_GetTopItem 1692 +#define wxListCtrl_GetViewRect 1693 +#define wxListCtrl_HitTest 1694 +#define wxListCtrl_InsertColumn_2 1695 +#define wxListCtrl_InsertColumn_3 1696 +#define wxListCtrl_InsertItem_1 1697 +#define wxListCtrl_InsertItem_2_1 1698 +#define wxListCtrl_InsertItem_2_0 1699 +#define wxListCtrl_InsertItem_3 1700 +#define wxListCtrl_RefreshItem 1701 +#define wxListCtrl_RefreshItems 1702 +#define wxListCtrl_ScrollList 1703 +#define wxListCtrl_SetBackgroundColour 1704 +#define wxListCtrl_SetColumn 1705 +#define wxListCtrl_SetColumnWidth 1706 +#define wxListCtrl_SetImageList 1707 +#define wxListCtrl_SetItem_1 1708 +#define wxListCtrl_SetItem_4 1709 +#define wxListCtrl_SetItemBackgroundColour 1710 +#define wxListCtrl_SetItemCount 1711 +#define wxListCtrl_SetItemData 1712 +#define wxListCtrl_SetItemFont 1713 +#define wxListCtrl_SetItemImage 1714 +#define wxListCtrl_SetItemColumnImage 1715 +#define wxListCtrl_SetItemPosition 1716 +#define wxListCtrl_SetItemState 1717 +#define wxListCtrl_SetItemText 1718 +#define wxListCtrl_SetItemTextColour 1719 +#define wxListCtrl_SetSingleStyle 1720 +#define wxListCtrl_SetTextColour 1721 +#define wxListCtrl_SetWindowStyleFlag 1722 +#define wxListCtrl_SortItems 1723 +#define wxListCtrl_destroy 1724 +#define wxListView_ClearColumnImage 1725 +#define wxListView_Focus 1726 +#define wxListView_GetFirstSelected 1727 +#define wxListView_GetFocusedItem 1728 +#define wxListView_GetNextSelected 1729 +#define wxListView_IsSelected 1730 +#define wxListView_Select 1731 +#define wxListView_SetColumnImage 1732 +#define wxListItem_new_0 1733 +#define wxListItem_new_1 1734 +#define wxListItem_destruct 1735 +#define wxListItem_Clear 1736 +#define wxListItem_GetAlign 1737 +#define wxListItem_GetBackgroundColour 1738 +#define wxListItem_GetColumn 1739 +#define wxListItem_GetFont 1740 +#define wxListItem_GetId 1741 +#define wxListItem_GetImage 1742 +#define wxListItem_GetMask 1743 +#define wxListItem_GetState 1744 +#define wxListItem_GetText 1745 +#define wxListItem_GetTextColour 1746 +#define wxListItem_GetWidth 1747 +#define wxListItem_SetAlign 1748 +#define wxListItem_SetBackgroundColour 1749 +#define wxListItem_SetColumn 1750 +#define wxListItem_SetFont 1751 +#define wxListItem_SetId 1752 +#define wxListItem_SetImage 1753 +#define wxListItem_SetMask 1754 +#define wxListItem_SetState 1755 +#define wxListItem_SetStateMask 1756 +#define wxListItem_SetText 1757 +#define wxListItem_SetTextColour 1758 +#define wxListItem_SetWidth 1759 +#define wxListItemAttr_new_0 1760 +#define wxListItemAttr_new_3 1761 +#define wxListItemAttr_GetBackgroundColour 1762 +#define wxListItemAttr_GetFont 1763 +#define wxListItemAttr_GetTextColour 1764 +#define wxListItemAttr_HasBackgroundColour 1765 +#define wxListItemAttr_HasFont 1766 +#define wxListItemAttr_HasTextColour 1767 +#define wxListItemAttr_SetBackgroundColour 1768 +#define wxListItemAttr_SetFont 1769 +#define wxListItemAttr_SetTextColour 1770 +#define wxListItemAttr_destroy 1771 +#define wxImageList_new_0 1772 +#define wxImageList_new_3 1773 +#define wxImageList_Add_1 1774 +#define wxImageList_Add_2_0 1775 +#define wxImageList_Add_2_1 1776 +#define wxImageList_Create 1777 +#define wxImageList_Draw 1779 +#define wxImageList_GetBitmap 1780 +#define wxImageList_GetIcon 1781 +#define wxImageList_GetImageCount 1782 +#define wxImageList_GetSize 1783 +#define wxImageList_Remove 1784 +#define wxImageList_RemoveAll 1785 +#define wxImageList_Replace_2 1786 +#define wxImageList_Replace_3 1787 +#define wxImageList_destroy 1788 +#define wxTextAttr_new_0 1789 +#define wxTextAttr_new_2 1790 +#define wxTextAttr_GetAlignment 1791 +#define wxTextAttr_GetBackgroundColour 1792 +#define wxTextAttr_GetFont 1793 +#define wxTextAttr_GetLeftIndent 1794 +#define wxTextAttr_GetLeftSubIndent 1795 +#define wxTextAttr_GetRightIndent 1796 +#define wxTextAttr_GetTabs 1797 +#define wxTextAttr_GetTextColour 1798 +#define wxTextAttr_HasBackgroundColour 1799 +#define wxTextAttr_HasFont 1800 +#define wxTextAttr_HasTextColour 1801 +#define wxTextAttr_GetFlags 1802 +#define wxTextAttr_IsDefault 1803 +#define wxTextAttr_SetAlignment 1804 +#define wxTextAttr_SetBackgroundColour 1805 +#define wxTextAttr_SetFlags 1806 +#define wxTextAttr_SetFont 1807 +#define wxTextAttr_SetLeftIndent 1808 +#define wxTextAttr_SetRightIndent 1809 +#define wxTextAttr_SetTabs 1810 +#define wxTextAttr_SetTextColour 1811 +#define wxTextAttr_destroy 1812 +#define wxTextCtrl_new_3 1814 +#define wxTextCtrl_new_0 1815 +#define wxTextCtrl_destruct 1817 +#define wxTextCtrl_AppendText 1818 +#define wxTextCtrl_CanCopy 1819 +#define wxTextCtrl_CanCut 1820 +#define wxTextCtrl_CanPaste 1821 +#define wxTextCtrl_CanRedo 1822 +#define wxTextCtrl_CanUndo 1823 +#define wxTextCtrl_Clear 1824 +#define wxTextCtrl_Copy 1825 +#define wxTextCtrl_Create 1826 +#define wxTextCtrl_Cut 1827 +#define wxTextCtrl_DiscardEdits 1828 +#define wxTextCtrl_ChangeValue 1829 +#define wxTextCtrl_EmulateKeyPress 1830 +#define wxTextCtrl_GetDefaultStyle 1831 +#define wxTextCtrl_GetInsertionPoint 1832 +#define wxTextCtrl_GetLastPosition 1833 +#define wxTextCtrl_GetLineLength 1834 +#define wxTextCtrl_GetLineText 1835 +#define wxTextCtrl_GetNumberOfLines 1836 +#define wxTextCtrl_GetRange 1837 +#define wxTextCtrl_GetSelection 1838 +#define wxTextCtrl_GetStringSelection 1839 +#define wxTextCtrl_GetStyle 1840 +#define wxTextCtrl_GetValue 1841 +#define wxTextCtrl_IsEditable 1842 +#define wxTextCtrl_IsModified 1843 +#define wxTextCtrl_IsMultiLine 1844 +#define wxTextCtrl_IsSingleLine 1845 +#define wxTextCtrl_LoadFile 1846 +#define wxTextCtrl_MarkDirty 1847 +#define wxTextCtrl_Paste 1848 +#define wxTextCtrl_PositionToXY 1849 +#define wxTextCtrl_Redo 1850 +#define wxTextCtrl_Remove 1851 +#define wxTextCtrl_Replace 1852 +#define wxTextCtrl_SaveFile 1853 +#define wxTextCtrl_SetDefaultStyle 1854 +#define wxTextCtrl_SetEditable 1855 +#define wxTextCtrl_SetInsertionPoint 1856 +#define wxTextCtrl_SetInsertionPointEnd 1857 +#define wxTextCtrl_SetMaxLength 1859 +#define wxTextCtrl_SetSelection 1860 +#define wxTextCtrl_SetStyle 1861 +#define wxTextCtrl_SetValue 1862 +#define wxTextCtrl_ShowPosition 1863 +#define wxTextCtrl_Undo 1864 +#define wxTextCtrl_WriteText 1865 +#define wxTextCtrl_XYToPosition 1866 +#define wxNotebook_new_0 1869 +#define wxNotebook_new_3 1870 +#define wxNotebook_destruct 1871 +#define wxNotebook_AddPage 1872 +#define wxNotebook_AdvanceSelection 1873 +#define wxNotebook_AssignImageList 1874 +#define wxNotebook_Create 1875 +#define wxNotebook_DeleteAllPages 1876 +#define wxNotebook_DeletePage 1877 +#define wxNotebook_RemovePage 1878 +#define wxNotebook_GetCurrentPage 1879 +#define wxNotebook_GetImageList 1880 +#define wxNotebook_GetPage 1882 +#define wxNotebook_GetPageCount 1883 +#define wxNotebook_GetPageImage 1884 +#define wxNotebook_GetPageText 1885 +#define wxNotebook_GetRowCount 1886 +#define wxNotebook_GetSelection 1887 +#define wxNotebook_GetThemeBackgroundColour 1888 +#define wxNotebook_HitTest 1890 +#define wxNotebook_InsertPage 1892 +#define wxNotebook_SetImageList 1893 +#define wxNotebook_SetPadding 1894 +#define wxNotebook_SetPageSize 1895 +#define wxNotebook_SetPageImage 1896 +#define wxNotebook_SetPageText 1897 +#define wxNotebook_SetSelection 1898 +#define wxNotebook_ChangeSelection 1899 +#define wxChoicebook_new_0 1900 +#define wxChoicebook_new_3 1901 +#define wxChoicebook_AddPage 1902 +#define wxChoicebook_AdvanceSelection 1903 +#define wxChoicebook_AssignImageList 1904 +#define wxChoicebook_Create 1905 +#define wxChoicebook_DeleteAllPages 1906 +#define wxChoicebook_DeletePage 1907 +#define wxChoicebook_RemovePage 1908 +#define wxChoicebook_GetCurrentPage 1909 +#define wxChoicebook_GetImageList 1910 +#define wxChoicebook_GetPage 1912 +#define wxChoicebook_GetPageCount 1913 +#define wxChoicebook_GetPageImage 1914 +#define wxChoicebook_GetPageText 1915 +#define wxChoicebook_GetSelection 1916 +#define wxChoicebook_HitTest 1917 +#define wxChoicebook_InsertPage 1918 +#define wxChoicebook_SetImageList 1919 +#define wxChoicebook_SetPageSize 1920 +#define wxChoicebook_SetPageImage 1921 +#define wxChoicebook_SetPageText 1922 +#define wxChoicebook_SetSelection 1923 +#define wxChoicebook_ChangeSelection 1924 +#define wxChoicebook_destroy 1925 +#define wxToolbook_new_0 1926 +#define wxToolbook_new_3 1927 +#define wxToolbook_AddPage 1928 +#define wxToolbook_AdvanceSelection 1929 +#define wxToolbook_AssignImageList 1930 +#define wxToolbook_Create 1931 +#define wxToolbook_DeleteAllPages 1932 +#define wxToolbook_DeletePage 1933 +#define wxToolbook_RemovePage 1934 +#define wxToolbook_GetCurrentPage 1935 +#define wxToolbook_GetImageList 1936 +#define wxToolbook_GetPage 1938 +#define wxToolbook_GetPageCount 1939 +#define wxToolbook_GetPageImage 1940 +#define wxToolbook_GetPageText 1941 +#define wxToolbook_GetSelection 1942 +#define wxToolbook_HitTest 1944 +#define wxToolbook_InsertPage 1945 +#define wxToolbook_SetImageList 1946 +#define wxToolbook_SetPageSize 1947 +#define wxToolbook_SetPageImage 1948 +#define wxToolbook_SetPageText 1949 +#define wxToolbook_SetSelection 1950 +#define wxToolbook_ChangeSelection 1951 +#define wxToolbook_destroy 1952 +#define wxListbook_new_0 1953 +#define wxListbook_new_3 1954 +#define wxListbook_AddPage 1955 +#define wxListbook_AdvanceSelection 1956 +#define wxListbook_AssignImageList 1957 +#define wxListbook_Create 1958 +#define wxListbook_DeleteAllPages 1959 +#define wxListbook_DeletePage 1960 +#define wxListbook_RemovePage 1961 +#define wxListbook_GetCurrentPage 1962 +#define wxListbook_GetImageList 1963 +#define wxListbook_GetPage 1965 +#define wxListbook_GetPageCount 1966 +#define wxListbook_GetPageImage 1967 +#define wxListbook_GetPageText 1968 +#define wxListbook_GetSelection 1969 +#define wxListbook_HitTest 1971 +#define wxListbook_InsertPage 1972 +#define wxListbook_SetImageList 1973 +#define wxListbook_SetPageSize 1974 +#define wxListbook_SetPageImage 1975 +#define wxListbook_SetPageText 1976 +#define wxListbook_SetSelection 1977 +#define wxListbook_ChangeSelection 1978 +#define wxListbook_destroy 1979 +#define wxTreebook_new_0 1980 +#define wxTreebook_new_3 1981 +#define wxTreebook_AddPage 1982 +#define wxTreebook_AdvanceSelection 1983 +#define wxTreebook_AssignImageList 1984 +#define wxTreebook_Create 1985 +#define wxTreebook_DeleteAllPages 1986 +#define wxTreebook_DeletePage 1987 +#define wxTreebook_RemovePage 1988 +#define wxTreebook_GetCurrentPage 1989 +#define wxTreebook_GetImageList 1990 +#define wxTreebook_GetPage 1992 +#define wxTreebook_GetPageCount 1993 +#define wxTreebook_GetPageImage 1994 +#define wxTreebook_GetPageText 1995 +#define wxTreebook_GetSelection 1996 +#define wxTreebook_ExpandNode 1997 +#define wxTreebook_IsNodeExpanded 1998 +#define wxTreebook_HitTest 2000 +#define wxTreebook_InsertPage 2001 +#define wxTreebook_InsertSubPage 2002 +#define wxTreebook_SetImageList 2003 +#define wxTreebook_SetPageSize 2004 +#define wxTreebook_SetPageImage 2005 +#define wxTreebook_SetPageText 2006 +#define wxTreebook_SetSelection 2007 +#define wxTreebook_ChangeSelection 2008 +#define wxTreebook_destroy 2009 +#define wxTreeCtrl_new_2 2012 +#define wxTreeCtrl_new_0 2013 +#define wxTreeCtrl_destruct 2015 +#define wxTreeCtrl_AddRoot 2016 +#define wxTreeCtrl_AppendItem 2017 +#define wxTreeCtrl_AssignImageList 2018 +#define wxTreeCtrl_AssignStateImageList 2019 +#define wxTreeCtrl_Collapse 2020 +#define wxTreeCtrl_CollapseAndReset 2021 +#define wxTreeCtrl_Create 2022 +#define wxTreeCtrl_Delete 2023 +#define wxTreeCtrl_DeleteAllItems 2024 +#define wxTreeCtrl_DeleteChildren 2025 +#define wxTreeCtrl_EditLabel 2026 +#define wxTreeCtrl_EnsureVisible 2027 +#define wxTreeCtrl_Expand 2028 +#define wxTreeCtrl_GetBoundingRect 2029 +#define wxTreeCtrl_GetChildrenCount 2031 +#define wxTreeCtrl_GetCount 2032 +#define wxTreeCtrl_GetEditControl 2033 +#define wxTreeCtrl_GetFirstChild 2034 +#define wxTreeCtrl_GetNextChild 2035 +#define wxTreeCtrl_GetFirstVisibleItem 2036 +#define wxTreeCtrl_GetImageList 2037 +#define wxTreeCtrl_GetIndent 2038 +#define wxTreeCtrl_GetItemBackgroundColour 2039 +#define wxTreeCtrl_GetItemData 2040 +#define wxTreeCtrl_GetItemFont 2041 +#define wxTreeCtrl_GetItemImage_1 2042 +#define wxTreeCtrl_GetItemImage_2 2043 +#define wxTreeCtrl_GetItemText 2044 +#define wxTreeCtrl_GetItemTextColour 2045 +#define wxTreeCtrl_GetLastChild 2046 +#define wxTreeCtrl_GetNextSibling 2047 +#define wxTreeCtrl_GetNextVisible 2048 +#define wxTreeCtrl_GetItemParent 2049 +#define wxTreeCtrl_GetPrevSibling 2050 +#define wxTreeCtrl_GetPrevVisible 2051 +#define wxTreeCtrl_GetRootItem 2052 +#define wxTreeCtrl_GetSelection 2053 +#define wxTreeCtrl_GetSelections 2054 +#define wxTreeCtrl_GetStateImageList 2055 +#define wxTreeCtrl_HitTest 2056 +#define wxTreeCtrl_InsertItem 2058 +#define wxTreeCtrl_IsBold 2059 +#define wxTreeCtrl_IsExpanded 2060 +#define wxTreeCtrl_IsSelected 2061 +#define wxTreeCtrl_IsVisible 2062 +#define wxTreeCtrl_ItemHasChildren 2063 +#define wxTreeCtrl_IsTreeItemIdOk 2064 +#define wxTreeCtrl_PrependItem 2065 +#define wxTreeCtrl_ScrollTo 2066 +#define wxTreeCtrl_SelectItem_1 2067 +#define wxTreeCtrl_SelectItem_2 2068 +#define wxTreeCtrl_SetIndent 2069 +#define wxTreeCtrl_SetImageList 2070 +#define wxTreeCtrl_SetItemBackgroundColour 2071 +#define wxTreeCtrl_SetItemBold 2072 +#define wxTreeCtrl_SetItemData 2073 +#define wxTreeCtrl_SetItemDropHighlight 2074 +#define wxTreeCtrl_SetItemFont 2075 +#define wxTreeCtrl_SetItemHasChildren 2076 +#define wxTreeCtrl_SetItemImage_2 2077 +#define wxTreeCtrl_SetItemImage_3 2078 +#define wxTreeCtrl_SetItemText 2079 +#define wxTreeCtrl_SetItemTextColour 2080 +#define wxTreeCtrl_SetStateImageList 2081 +#define wxTreeCtrl_SetWindowStyle 2082 +#define wxTreeCtrl_SortChildren 2083 +#define wxTreeCtrl_Toggle 2084 +#define wxTreeCtrl_ToggleItemSelection 2085 +#define wxTreeCtrl_Unselect 2086 +#define wxTreeCtrl_UnselectAll 2087 +#define wxTreeCtrl_UnselectItem 2088 +#define wxScrollBar_new_0 2089 +#define wxScrollBar_new_3 2090 +#define wxScrollBar_destruct 2091 +#define wxScrollBar_Create 2092 +#define wxScrollBar_GetRange 2093 +#define wxScrollBar_GetPageSize 2094 +#define wxScrollBar_GetThumbPosition 2095 +#define wxScrollBar_GetThumbSize 2096 +#define wxScrollBar_SetThumbPosition 2097 +#define wxScrollBar_SetScrollbar 2098 +#define wxSpinButton_new_2 2100 +#define wxSpinButton_new_0 2101 +#define wxSpinButton_Create 2102 +#define wxSpinButton_GetMax 2103 +#define wxSpinButton_GetMin 2104 +#define wxSpinButton_GetValue 2105 +#define wxSpinButton_SetRange 2106 +#define wxSpinButton_SetValue 2107 +#define wxSpinButton_destroy 2108 +#define wxSpinCtrl_new_0 2109 +#define wxSpinCtrl_new_2 2110 +#define wxSpinCtrl_Create 2112 +#define wxSpinCtrl_SetValue_1_1 2115 +#define wxSpinCtrl_SetValue_1_0 2116 +#define wxSpinCtrl_GetValue 2118 +#define wxSpinCtrl_SetRange 2120 +#define wxSpinCtrl_SetSelection 2121 +#define wxSpinCtrl_GetMin 2123 +#define wxSpinCtrl_GetMax 2125 +#define wxSpinCtrl_destroy 2126 +#define wxStaticText_new_0 2127 +#define wxStaticText_new_4 2128 +#define wxStaticText_Create 2129 +#define wxStaticText_GetLabel 2130 +#define wxStaticText_SetLabel 2131 +#define wxStaticText_Wrap 2132 +#define wxStaticText_destroy 2133 +#define wxStaticBitmap_new_0 2134 +#define wxStaticBitmap_new_4 2135 +#define wxStaticBitmap_Create 2136 +#define wxStaticBitmap_GetBitmap 2137 +#define wxStaticBitmap_SetBitmap 2138 +#define wxStaticBitmap_destroy 2139 +#define wxRadioBox_new 2140 +#define wxRadioBox_destruct 2142 +#define wxRadioBox_Create 2143 +#define wxRadioBox_Enable_2 2144 +#define wxRadioBox_Enable_1 2145 +#define wxRadioBox_GetSelection 2146 +#define wxRadioBox_GetString 2147 +#define wxRadioBox_SetSelection 2148 +#define wxRadioBox_Show_2 2149 +#define wxRadioBox_Show_1 2150 +#define wxRadioBox_GetColumnCount 2151 +#define wxRadioBox_GetItemHelpText 2152 +#define wxRadioBox_GetItemToolTip 2153 +#define wxRadioBox_GetItemFromPoint 2155 +#define wxRadioBox_GetRowCount 2156 +#define wxRadioBox_IsItemEnabled 2157 +#define wxRadioBox_IsItemShown 2158 +#define wxRadioBox_SetItemHelpText 2159 +#define wxRadioBox_SetItemToolTip 2160 +#define wxRadioButton_new_0 2161 +#define wxRadioButton_new_4 2162 +#define wxRadioButton_Create 2163 +#define wxRadioButton_GetValue 2164 +#define wxRadioButton_SetValue 2165 +#define wxRadioButton_destroy 2166 +#define wxSlider_new_6 2168 +#define wxSlider_new_0 2169 +#define wxSlider_Create 2170 +#define wxSlider_GetLineSize 2171 +#define wxSlider_GetMax 2172 +#define wxSlider_GetMin 2173 +#define wxSlider_GetPageSize 2174 +#define wxSlider_GetThumbLength 2175 +#define wxSlider_GetValue 2176 +#define wxSlider_SetLineSize 2177 +#define wxSlider_SetPageSize 2178 +#define wxSlider_SetRange 2179 +#define wxSlider_SetThumbLength 2180 +#define wxSlider_SetValue 2181 +#define wxSlider_destroy 2182 +#define wxDialog_new_4 2184 +#define wxDialog_new_0 2185 +#define wxDialog_destruct 2187 +#define wxDialog_Create 2188 +#define wxDialog_CreateButtonSizer 2189 +#define wxDialog_CreateStdDialogButtonSizer 2190 +#define wxDialog_EndModal 2191 +#define wxDialog_GetAffirmativeId 2192 +#define wxDialog_GetReturnCode 2193 +#define wxDialog_IsModal 2194 +#define wxDialog_SetAffirmativeId 2195 +#define wxDialog_SetReturnCode 2196 +#define wxDialog_Show 2197 +#define wxDialog_ShowModal 2198 +#define wxColourDialog_new_0 2199 +#define wxColourDialog_new_2 2200 +#define wxColourDialog_destruct 2201 +#define wxColourDialog_Create 2202 +#define wxColourDialog_GetColourData 2203 +#define wxColourData_new_0 2204 +#define wxColourData_new_1 2205 +#define wxColourData_destruct 2206 +#define wxColourData_GetChooseFull 2207 +#define wxColourData_GetColour 2208 +#define wxColourData_GetCustomColour 2210 +#define wxColourData_SetChooseFull 2211 +#define wxColourData_SetColour 2212 +#define wxColourData_SetCustomColour 2213 +#define wxPalette_new_0 2214 +#define wxPalette_new_4 2215 +#define wxPalette_destruct 2217 +#define wxPalette_Create 2218 +#define wxPalette_GetColoursCount 2219 +#define wxPalette_GetPixel 2220 +#define wxPalette_GetRGB 2221 +#define wxPalette_IsOk 2222 +#define wxDirDialog_new 2226 +#define wxDirDialog_destruct 2227 +#define wxDirDialog_GetPath 2228 +#define wxDirDialog_GetMessage 2229 +#define wxDirDialog_SetMessage 2230 +#define wxDirDialog_SetPath 2231 +#define wxFileDialog_new 2235 +#define wxFileDialog_destruct 2236 +#define wxFileDialog_GetDirectory 2237 +#define wxFileDialog_GetFilename 2238 +#define wxFileDialog_GetFilenames 2239 +#define wxFileDialog_GetFilterIndex 2240 +#define wxFileDialog_GetMessage 2241 +#define wxFileDialog_GetPath 2242 +#define wxFileDialog_GetPaths 2243 +#define wxFileDialog_GetWildcard 2244 +#define wxFileDialog_SetDirectory 2245 +#define wxFileDialog_SetFilename 2246 +#define wxFileDialog_SetFilterIndex 2247 +#define wxFileDialog_SetMessage 2248 +#define wxFileDialog_SetPath 2249 +#define wxFileDialog_SetWildcard 2250 +#define wxPickerBase_SetInternalMargin 2251 +#define wxPickerBase_GetInternalMargin 2252 +#define wxPickerBase_SetTextCtrlProportion 2253 +#define wxPickerBase_SetPickerCtrlProportion 2254 +#define wxPickerBase_GetTextCtrlProportion 2255 +#define wxPickerBase_GetPickerCtrlProportion 2256 +#define wxPickerBase_HasTextCtrl 2257 +#define wxPickerBase_GetTextCtrl 2258 +#define wxPickerBase_IsTextCtrlGrowable 2259 +#define wxPickerBase_SetPickerCtrlGrowable 2260 +#define wxPickerBase_SetTextCtrlGrowable 2261 +#define wxPickerBase_IsPickerCtrlGrowable 2262 +#define wxFilePickerCtrl_new_0 2263 +#define wxFilePickerCtrl_new_3 2264 +#define wxFilePickerCtrl_Create 2265 +#define wxFilePickerCtrl_GetPath 2266 +#define wxFilePickerCtrl_SetPath 2267 +#define wxFilePickerCtrl_destroy 2268 +#define wxDirPickerCtrl_new_0 2269 +#define wxDirPickerCtrl_new_3 2270 +#define wxDirPickerCtrl_Create 2271 +#define wxDirPickerCtrl_GetPath 2272 +#define wxDirPickerCtrl_SetPath 2273 +#define wxDirPickerCtrl_destroy 2274 +#define wxColourPickerCtrl_new_0 2275 +#define wxColourPickerCtrl_new_3 2276 +#define wxColourPickerCtrl_Create 2277 +#define wxColourPickerCtrl_GetColour 2278 +#define wxColourPickerCtrl_SetColour_1_1 2279 +#define wxColourPickerCtrl_SetColour_1_0 2280 +#define wxColourPickerCtrl_destroy 2281 +#define wxDatePickerCtrl_new_0 2282 +#define wxDatePickerCtrl_new_3 2283 +#define wxDatePickerCtrl_GetRange 2284 +#define wxDatePickerCtrl_GetValue 2285 +#define wxDatePickerCtrl_SetRange 2286 +#define wxDatePickerCtrl_SetValue 2287 +#define wxDatePickerCtrl_destroy 2288 +#define wxFontPickerCtrl_new_0 2289 +#define wxFontPickerCtrl_new_3 2290 +#define wxFontPickerCtrl_Create 2291 +#define wxFontPickerCtrl_GetSelectedFont 2292 +#define wxFontPickerCtrl_SetSelectedFont 2293 +#define wxFontPickerCtrl_GetMaxPointSize 2294 +#define wxFontPickerCtrl_SetMaxPointSize 2295 +#define wxFontPickerCtrl_destroy 2296 +#define wxFindReplaceDialog_new_0 2299 +#define wxFindReplaceDialog_new_4 2300 +#define wxFindReplaceDialog_destruct 2301 +#define wxFindReplaceDialog_Create 2302 +#define wxFindReplaceDialog_GetData 2303 +#define wxFindReplaceData_new_0 2304 +#define wxFindReplaceData_new_1 2305 +#define wxFindReplaceData_GetFindString 2306 +#define wxFindReplaceData_GetReplaceString 2307 +#define wxFindReplaceData_GetFlags 2308 +#define wxFindReplaceData_SetFlags 2309 +#define wxFindReplaceData_SetFindString 2310 +#define wxFindReplaceData_SetReplaceString 2311 +#define wxFindReplaceData_destroy 2312 +#define wxMultiChoiceDialog_new_0 2313 +#define wxMultiChoiceDialog_new_5 2315 +#define wxMultiChoiceDialog_GetSelections 2316 +#define wxMultiChoiceDialog_SetSelections 2317 +#define wxMultiChoiceDialog_destroy 2318 +#define wxSingleChoiceDialog_new_0 2319 +#define wxSingleChoiceDialog_new_5 2321 +#define wxSingleChoiceDialog_GetSelection 2322 +#define wxSingleChoiceDialog_GetStringSelection 2323 +#define wxSingleChoiceDialog_SetSelection 2324 +#define wxSingleChoiceDialog_destroy 2325 +#define wxTextEntryDialog_new 2326 +#define wxTextEntryDialog_GetValue 2327 +#define wxTextEntryDialog_SetValue 2328 +#define wxTextEntryDialog_destroy 2329 +#define wxPasswordEntryDialog_new 2330 +#define wxPasswordEntryDialog_destroy 2331 +#define wxFontData_new_0 2332 +#define wxFontData_new_1 2333 +#define wxFontData_destruct 2334 +#define wxFontData_EnableEffects 2335 +#define wxFontData_GetAllowSymbols 2336 +#define wxFontData_GetColour 2337 +#define wxFontData_GetChosenFont 2338 +#define wxFontData_GetEnableEffects 2339 +#define wxFontData_GetInitialFont 2340 +#define wxFontData_GetShowHelp 2341 +#define wxFontData_SetAllowSymbols 2342 +#define wxFontData_SetChosenFont 2343 +#define wxFontData_SetColour 2344 +#define wxFontData_SetInitialFont 2345 +#define wxFontData_SetRange 2346 +#define wxFontData_SetShowHelp 2347 +#define wxFontDialog_new_0 2351 +#define wxFontDialog_new_2 2353 +#define wxFontDialog_Create 2355 +#define wxFontDialog_GetFontData 2356 +#define wxFontDialog_destroy 2358 +#define wxProgressDialog_new 2359 +#define wxProgressDialog_destruct 2360 +#define wxProgressDialog_Resume 2361 +#define wxProgressDialog_Update_2 2362 +#define wxProgressDialog_Update_0 2363 +#define wxMessageDialog_new 2364 +#define wxMessageDialog_destruct 2365 +#define wxPageSetupDialog_new 2366 +#define wxPageSetupDialog_destruct 2367 +#define wxPageSetupDialog_GetPageSetupData 2368 +#define wxPageSetupDialog_ShowModal 2369 +#define wxPageSetupDialogData_new_0 2370 +#define wxPageSetupDialogData_new_1_0 2371 +#define wxPageSetupDialogData_new_1_1 2372 +#define wxPageSetupDialogData_destruct 2373 +#define wxPageSetupDialogData_EnableHelp 2374 +#define wxPageSetupDialogData_EnableMargins 2375 +#define wxPageSetupDialogData_EnableOrientation 2376 +#define wxPageSetupDialogData_EnablePaper 2377 +#define wxPageSetupDialogData_EnablePrinter 2378 +#define wxPageSetupDialogData_GetDefaultMinMargins 2379 +#define wxPageSetupDialogData_GetEnableMargins 2380 +#define wxPageSetupDialogData_GetEnableOrientation 2381 +#define wxPageSetupDialogData_GetEnablePaper 2382 +#define wxPageSetupDialogData_GetEnablePrinter 2383 +#define wxPageSetupDialogData_GetEnableHelp 2384 +#define wxPageSetupDialogData_GetDefaultInfo 2385 +#define wxPageSetupDialogData_GetMarginTopLeft 2386 +#define wxPageSetupDialogData_GetMarginBottomRight 2387 +#define wxPageSetupDialogData_GetMinMarginTopLeft 2388 +#define wxPageSetupDialogData_GetMinMarginBottomRight 2389 +#define wxPageSetupDialogData_GetPaperId 2390 +#define wxPageSetupDialogData_GetPaperSize 2391 +#define wxPageSetupDialogData_GetPrintData 2393 +#define wxPageSetupDialogData_IsOk 2394 +#define wxPageSetupDialogData_SetDefaultInfo 2395 +#define wxPageSetupDialogData_SetDefaultMinMargins 2396 +#define wxPageSetupDialogData_SetMarginTopLeft 2397 +#define wxPageSetupDialogData_SetMarginBottomRight 2398 +#define wxPageSetupDialogData_SetMinMarginTopLeft 2399 +#define wxPageSetupDialogData_SetMinMarginBottomRight 2400 +#define wxPageSetupDialogData_SetPaperId 2401 +#define wxPageSetupDialogData_SetPaperSize_1_1 2402 +#define wxPageSetupDialogData_SetPaperSize_1_0 2403 +#define wxPageSetupDialogData_SetPrintData 2404 +#define wxPrintDialog_new_2_0 2405 +#define wxPrintDialog_new_2_1 2406 +#define wxPrintDialog_destruct 2407 +#define wxPrintDialog_GetPrintDialogData 2408 +#define wxPrintDialog_GetPrintDC 2409 +#define wxPrintDialogData_new_0 2410 +#define wxPrintDialogData_new_1_1 2411 +#define wxPrintDialogData_new_1_0 2412 +#define wxPrintDialogData_destruct 2413 +#define wxPrintDialogData_EnableHelp 2414 +#define wxPrintDialogData_EnablePageNumbers 2415 +#define wxPrintDialogData_EnablePrintToFile 2416 +#define wxPrintDialogData_EnableSelection 2417 +#define wxPrintDialogData_GetAllPages 2418 +#define wxPrintDialogData_GetCollate 2419 +#define wxPrintDialogData_GetFromPage 2420 +#define wxPrintDialogData_GetMaxPage 2421 +#define wxPrintDialogData_GetMinPage 2422 +#define wxPrintDialogData_GetNoCopies 2423 +#define wxPrintDialogData_GetPrintData 2424 +#define wxPrintDialogData_GetPrintToFile 2425 +#define wxPrintDialogData_GetSelection 2426 +#define wxPrintDialogData_GetToPage 2427 +#define wxPrintDialogData_IsOk 2428 +#define wxPrintDialogData_SetCollate 2429 +#define wxPrintDialogData_SetFromPage 2430 +#define wxPrintDialogData_SetMaxPage 2431 +#define wxPrintDialogData_SetMinPage 2432 +#define wxPrintDialogData_SetNoCopies 2433 +#define wxPrintDialogData_SetPrintData 2434 +#define wxPrintDialogData_SetPrintToFile 2435 +#define wxPrintDialogData_SetSelection 2436 +#define wxPrintDialogData_SetToPage 2437 +#define wxPrintData_new_0 2438 +#define wxPrintData_new_1 2439 +#define wxPrintData_destruct 2440 +#define wxPrintData_GetCollate 2441 +#define wxPrintData_GetBin 2442 +#define wxPrintData_GetColour 2443 +#define wxPrintData_GetDuplex 2444 +#define wxPrintData_GetNoCopies 2445 +#define wxPrintData_GetOrientation 2446 +#define wxPrintData_GetPaperId 2447 +#define wxPrintData_GetPrinterName 2448 +#define wxPrintData_GetQuality 2449 +#define wxPrintData_IsOk 2450 +#define wxPrintData_SetBin 2451 +#define wxPrintData_SetCollate 2452 +#define wxPrintData_SetColour 2453 +#define wxPrintData_SetDuplex 2454 +#define wxPrintData_SetNoCopies 2455 +#define wxPrintData_SetOrientation 2456 +#define wxPrintData_SetPaperId 2457 +#define wxPrintData_SetPrinterName 2458 +#define wxPrintData_SetQuality 2459 +#define wxPrintPreview_new_2 2462 +#define wxPrintPreview_new_3 2463 +#define wxPrintPreview_destruct 2465 +#define wxPrintPreview_GetCanvas 2466 +#define wxPrintPreview_GetCurrentPage 2467 +#define wxPrintPreview_GetFrame 2468 +#define wxPrintPreview_GetMaxPage 2469 +#define wxPrintPreview_GetMinPage 2470 +#define wxPrintPreview_GetPrintout 2471 +#define wxPrintPreview_GetPrintoutForPrinting 2472 +#define wxPrintPreview_IsOk 2473 +#define wxPrintPreview_PaintPage 2474 +#define wxPrintPreview_Print 2475 +#define wxPrintPreview_RenderPage 2476 +#define wxPrintPreview_SetCanvas 2477 +#define wxPrintPreview_SetCurrentPage 2478 +#define wxPrintPreview_SetFrame 2479 +#define wxPrintPreview_SetPrintout 2480 +#define wxPrintPreview_SetZoom 2481 +#define wxPreviewFrame_new 2482 +#define wxPreviewFrame_destruct 2483 +#define wxPreviewFrame_CreateControlBar 2484 +#define wxPreviewFrame_CreateCanvas 2485 +#define wxPreviewFrame_Initialize 2486 +#define wxPreviewFrame_OnCloseWindow 2487 +#define wxPreviewControlBar_new 2488 +#define wxPreviewControlBar_destruct 2489 +#define wxPreviewControlBar_CreateButtons 2490 +#define wxPreviewControlBar_GetPrintPreview 2491 +#define wxPreviewControlBar_GetZoomControl 2492 +#define wxPreviewControlBar_SetZoomControl 2493 +#define wxPrinter_new 2495 +#define wxPrinter_CreateAbortWindow 2496 +#define wxPrinter_GetAbort 2497 +#define wxPrinter_GetLastError 2498 +#define wxPrinter_GetPrintDialogData 2499 +#define wxPrinter_Print 2500 +#define wxPrinter_PrintDialog 2501 +#define wxPrinter_ReportError 2502 +#define wxPrinter_Setup 2503 +#define wxPrinter_destroy 2504 +#define wxXmlResource_new_1 2505 +#define wxXmlResource_new_2 2506 +#define wxXmlResource_destruct 2507 +#define wxXmlResource_AttachUnknownControl 2508 +#define wxXmlResource_ClearHandlers 2509 +#define wxXmlResource_CompareVersion 2510 +#define wxXmlResource_Get 2511 +#define wxXmlResource_GetFlags 2512 +#define wxXmlResource_GetVersion 2513 +#define wxXmlResource_GetXRCID 2514 +#define wxXmlResource_InitAllHandlers 2515 +#define wxXmlResource_Load 2516 +#define wxXmlResource_LoadBitmap 2517 +#define wxXmlResource_LoadDialog_2 2518 +#define wxXmlResource_LoadDialog_3 2519 +#define wxXmlResource_LoadFrame_2 2520 +#define wxXmlResource_LoadFrame_3 2521 +#define wxXmlResource_LoadIcon 2522 +#define wxXmlResource_LoadMenu 2523 +#define wxXmlResource_LoadMenuBar_2 2524 +#define wxXmlResource_LoadMenuBar_1 2525 +#define wxXmlResource_LoadPanel_2 2526 +#define wxXmlResource_LoadPanel_3 2527 +#define wxXmlResource_LoadToolBar 2528 +#define wxXmlResource_Set 2529 +#define wxXmlResource_SetFlags 2530 +#define wxXmlResource_Unload 2531 +#define wxXmlResource_xrcctrl 2532 +#define wxHtmlEasyPrinting_new 2533 +#define wxHtmlEasyPrinting_destruct 2534 +#define wxHtmlEasyPrinting_GetPrintData 2535 +#define wxHtmlEasyPrinting_GetPageSetupData 2536 +#define wxHtmlEasyPrinting_PreviewFile 2537 +#define wxHtmlEasyPrinting_PreviewText 2538 +#define wxHtmlEasyPrinting_PrintFile 2539 +#define wxHtmlEasyPrinting_PrintText 2540 +#define wxHtmlEasyPrinting_PageSetup 2541 +#define wxHtmlEasyPrinting_SetFonts 2542 +#define wxHtmlEasyPrinting_SetHeader 2543 +#define wxHtmlEasyPrinting_SetFooter 2544 +#define wxGLCanvas_new_2 2546 +#define wxGLCanvas_new_3_1 2547 +#define wxGLCanvas_new_3_0 2548 +#define wxGLCanvas_GetContext 2549 +#define wxGLCanvas_SetCurrent 2551 +#define wxGLCanvas_SwapBuffers 2552 +#define wxGLCanvas_destroy 2553 +#define wxAuiManager_new 2554 +#define wxAuiManager_destruct 2555 +#define wxAuiManager_AddPane_2_1 2556 +#define wxAuiManager_AddPane_3 2557 +#define wxAuiManager_AddPane_2_0 2558 +#define wxAuiManager_DetachPane 2559 +#define wxAuiManager_GetAllPanes 2560 +#define wxAuiManager_GetArtProvider 2561 +#define wxAuiManager_GetDockSizeConstraint 2562 +#define wxAuiManager_GetFlags 2563 +#define wxAuiManager_GetManagedWindow 2564 +#define wxAuiManager_GetManager 2565 +#define wxAuiManager_GetPane_1_1 2566 +#define wxAuiManager_GetPane_1_0 2567 +#define wxAuiManager_HideHint 2568 +#define wxAuiManager_InsertPane 2569 +#define wxAuiManager_LoadPaneInfo 2570 +#define wxAuiManager_LoadPerspective 2571 +#define wxAuiManager_SavePaneInfo 2572 +#define wxAuiManager_SavePerspective 2573 +#define wxAuiManager_SetArtProvider 2574 +#define wxAuiManager_SetDockSizeConstraint 2575 +#define wxAuiManager_SetFlags 2576 +#define wxAuiManager_SetManagedWindow 2577 +#define wxAuiManager_ShowHint 2578 +#define wxAuiManager_UnInit 2579 +#define wxAuiManager_Update 2580 +#define wxAuiPaneInfo_new_0 2581 +#define wxAuiPaneInfo_new_1 2582 +#define wxAuiPaneInfo_destruct 2583 +#define wxAuiPaneInfo_BestSize_1 2584 +#define wxAuiPaneInfo_BestSize_2 2585 +#define wxAuiPaneInfo_Bottom 2586 +#define wxAuiPaneInfo_BottomDockable 2587 +#define wxAuiPaneInfo_Caption 2588 +#define wxAuiPaneInfo_CaptionVisible 2589 +#define wxAuiPaneInfo_Centre 2590 +#define wxAuiPaneInfo_CentrePane 2591 +#define wxAuiPaneInfo_CloseButton 2592 +#define wxAuiPaneInfo_DefaultPane 2593 +#define wxAuiPaneInfo_DestroyOnClose 2594 +#define wxAuiPaneInfo_Direction 2595 +#define wxAuiPaneInfo_Dock 2596 +#define wxAuiPaneInfo_Dockable 2597 +#define wxAuiPaneInfo_Fixed 2598 +#define wxAuiPaneInfo_Float 2599 +#define wxAuiPaneInfo_Floatable 2600 +#define wxAuiPaneInfo_FloatingPosition_1 2601 +#define wxAuiPaneInfo_FloatingPosition_2 2602 +#define wxAuiPaneInfo_FloatingSize_1 2603 +#define wxAuiPaneInfo_FloatingSize_2 2604 +#define wxAuiPaneInfo_Gripper 2605 +#define wxAuiPaneInfo_GripperTop 2606 +#define wxAuiPaneInfo_HasBorder 2607 +#define wxAuiPaneInfo_HasCaption 2608 +#define wxAuiPaneInfo_HasCloseButton 2609 +#define wxAuiPaneInfo_HasFlag 2610 +#define wxAuiPaneInfo_HasGripper 2611 +#define wxAuiPaneInfo_HasGripperTop 2612 +#define wxAuiPaneInfo_HasMaximizeButton 2613 +#define wxAuiPaneInfo_HasMinimizeButton 2614 +#define wxAuiPaneInfo_HasPinButton 2615 +#define wxAuiPaneInfo_Hide 2616 +#define wxAuiPaneInfo_IsBottomDockable 2617 +#define wxAuiPaneInfo_IsDocked 2618 +#define wxAuiPaneInfo_IsFixed 2619 +#define wxAuiPaneInfo_IsFloatable 2620 +#define wxAuiPaneInfo_IsFloating 2621 +#define wxAuiPaneInfo_IsLeftDockable 2622 +#define wxAuiPaneInfo_IsMovable 2623 +#define wxAuiPaneInfo_IsOk 2624 +#define wxAuiPaneInfo_IsResizable 2625 +#define wxAuiPaneInfo_IsRightDockable 2626 +#define wxAuiPaneInfo_IsShown 2627 +#define wxAuiPaneInfo_IsToolbar 2628 +#define wxAuiPaneInfo_IsTopDockable 2629 +#define wxAuiPaneInfo_Layer 2630 +#define wxAuiPaneInfo_Left 2631 +#define wxAuiPaneInfo_LeftDockable 2632 +#define wxAuiPaneInfo_MaxSize_1 2633 +#define wxAuiPaneInfo_MaxSize_2 2634 +#define wxAuiPaneInfo_MaximizeButton 2635 +#define wxAuiPaneInfo_MinSize_1 2636 +#define wxAuiPaneInfo_MinSize_2 2637 +#define wxAuiPaneInfo_MinimizeButton 2638 +#define wxAuiPaneInfo_Movable 2639 +#define wxAuiPaneInfo_Name 2640 +#define wxAuiPaneInfo_PaneBorder 2641 +#define wxAuiPaneInfo_PinButton 2642 +#define wxAuiPaneInfo_Position 2643 +#define wxAuiPaneInfo_Resizable 2644 +#define wxAuiPaneInfo_Right 2645 +#define wxAuiPaneInfo_RightDockable 2646 +#define wxAuiPaneInfo_Row 2647 +#define wxAuiPaneInfo_SafeSet 2648 +#define wxAuiPaneInfo_SetFlag 2649 +#define wxAuiPaneInfo_Show 2650 +#define wxAuiPaneInfo_ToolbarPane 2651 +#define wxAuiPaneInfo_Top 2652 +#define wxAuiPaneInfo_TopDockable 2653 +#define wxAuiPaneInfo_Window 2654 +#define wxAuiPaneInfo_GetWindow 2655 +#define wxAuiPaneInfo_GetFrame 2656 +#define wxAuiPaneInfo_GetDirection 2657 +#define wxAuiPaneInfo_GetLayer 2658 +#define wxAuiPaneInfo_GetRow 2659 +#define wxAuiPaneInfo_GetPosition 2660 +#define wxAuiPaneInfo_GetFloatingPosition 2661 +#define wxAuiPaneInfo_GetFloatingSize 2662 +#define wxAuiNotebook_new_0 2663 +#define wxAuiNotebook_new_2 2664 +#define wxAuiNotebook_AddPage 2665 +#define wxAuiNotebook_Create 2666 +#define wxAuiNotebook_DeletePage 2667 +#define wxAuiNotebook_GetArtProvider 2668 +#define wxAuiNotebook_GetPage 2669 +#define wxAuiNotebook_GetPageBitmap 2670 +#define wxAuiNotebook_GetPageCount 2671 +#define wxAuiNotebook_GetPageIndex 2672 +#define wxAuiNotebook_GetPageText 2673 +#define wxAuiNotebook_GetSelection 2674 +#define wxAuiNotebook_InsertPage 2675 +#define wxAuiNotebook_RemovePage 2676 +#define wxAuiNotebook_SetArtProvider 2677 +#define wxAuiNotebook_SetFont 2678 +#define wxAuiNotebook_SetPageBitmap 2679 +#define wxAuiNotebook_SetPageText 2680 +#define wxAuiNotebook_SetSelection 2681 +#define wxAuiNotebook_SetTabCtrlHeight 2682 +#define wxAuiNotebook_SetUniformBitmapSize 2683 +#define wxAuiNotebook_destroy 2684 +#define wxAuiTabArt_SetFlags 2685 +#define wxAuiTabArt_SetMeasuringFont 2686 +#define wxAuiTabArt_SetNormalFont 2687 +#define wxAuiTabArt_SetSelectedFont 2688 +#define wxAuiTabArt_SetColour 2689 +#define wxAuiTabArt_SetActiveColour 2690 +#define wxAuiDockArt_GetColour 2691 +#define wxAuiDockArt_GetFont 2692 +#define wxAuiDockArt_GetMetric 2693 +#define wxAuiDockArt_SetColour 2694 +#define wxAuiDockArt_SetFont 2695 +#define wxAuiDockArt_SetMetric 2696 +#define wxAuiSimpleTabArt_new 2697 +#define wxAuiSimpleTabArt_destroy 2698 +#define wxMDIParentFrame_new_0 2699 +#define wxMDIParentFrame_new_4 2700 +#define wxMDIParentFrame_destruct 2701 +#define wxMDIParentFrame_ActivateNext 2702 +#define wxMDIParentFrame_ActivatePrevious 2703 +#define wxMDIParentFrame_ArrangeIcons 2704 +#define wxMDIParentFrame_Cascade 2705 +#define wxMDIParentFrame_Create 2706 +#define wxMDIParentFrame_GetActiveChild 2707 +#define wxMDIParentFrame_GetClientWindow 2708 +#define wxMDIParentFrame_Tile 2709 +#define wxMDIChildFrame_new_0 2710 +#define wxMDIChildFrame_new_4 2711 +#define wxMDIChildFrame_destruct 2712 +#define wxMDIChildFrame_Activate 2713 +#define wxMDIChildFrame_Create 2714 +#define wxMDIChildFrame_Maximize 2715 +#define wxMDIChildFrame_Restore 2716 +#define wxMDIClientWindow_new_0 2717 +#define wxMDIClientWindow_new_2 2718 +#define wxMDIClientWindow_destruct 2719 +#define wxMDIClientWindow_CreateClient 2720 +#define wxLayoutAlgorithm_new 2721 +#define wxLayoutAlgorithm_LayoutFrame 2722 +#define wxLayoutAlgorithm_LayoutMDIFrame 2723 +#define wxLayoutAlgorithm_LayoutWindow 2724 +#define wxLayoutAlgorithm_destroy 2725 +#define wxEvent_GetId 2726 +#define wxEvent_GetSkipped 2727 +#define wxEvent_GetTimestamp 2728 +#define wxEvent_IsCommandEvent 2729 +#define wxEvent_ResumePropagation 2730 +#define wxEvent_ShouldPropagate 2731 +#define wxEvent_Skip 2732 +#define wxEvent_StopPropagation 2733 +#define wxCommandEvent_getClientData 2734 +#define wxCommandEvent_GetExtraLong 2735 +#define wxCommandEvent_GetInt 2736 +#define wxCommandEvent_GetSelection 2737 +#define wxCommandEvent_GetString 2738 +#define wxCommandEvent_IsChecked 2739 +#define wxCommandEvent_IsSelection 2740 +#define wxCommandEvent_SetInt 2741 +#define wxCommandEvent_SetString 2742 +#define wxScrollEvent_GetOrientation 2743 +#define wxScrollEvent_GetPosition 2744 +#define wxScrollWinEvent_GetOrientation 2745 +#define wxScrollWinEvent_GetPosition 2746 +#define wxMouseEvent_AltDown 2747 +#define wxMouseEvent_Button 2748 +#define wxMouseEvent_ButtonDClick 2749 +#define wxMouseEvent_ButtonDown 2750 +#define wxMouseEvent_ButtonUp 2751 +#define wxMouseEvent_CmdDown 2752 +#define wxMouseEvent_ControlDown 2753 +#define wxMouseEvent_Dragging 2754 +#define wxMouseEvent_Entering 2755 +#define wxMouseEvent_GetButton 2756 +#define wxMouseEvent_GetPosition 2759 +#define wxMouseEvent_GetLogicalPosition 2760 +#define wxMouseEvent_GetLinesPerAction 2761 +#define wxMouseEvent_GetWheelRotation 2762 +#define wxMouseEvent_GetWheelDelta 2763 +#define wxMouseEvent_GetX 2764 +#define wxMouseEvent_GetY 2765 +#define wxMouseEvent_IsButton 2766 +#define wxMouseEvent_IsPageScroll 2767 +#define wxMouseEvent_Leaving 2768 +#define wxMouseEvent_LeftDClick 2769 +#define wxMouseEvent_LeftDown 2770 +#define wxMouseEvent_LeftIsDown 2771 +#define wxMouseEvent_LeftUp 2772 +#define wxMouseEvent_MetaDown 2773 +#define wxMouseEvent_MiddleDClick 2774 +#define wxMouseEvent_MiddleDown 2775 +#define wxMouseEvent_MiddleIsDown 2776 +#define wxMouseEvent_MiddleUp 2777 +#define wxMouseEvent_Moving 2778 +#define wxMouseEvent_RightDClick 2779 +#define wxMouseEvent_RightDown 2780 +#define wxMouseEvent_RightIsDown 2781 +#define wxMouseEvent_RightUp 2782 +#define wxMouseEvent_ShiftDown 2783 +#define wxSetCursorEvent_GetCursor 2784 +#define wxSetCursorEvent_GetX 2785 +#define wxSetCursorEvent_GetY 2786 +#define wxSetCursorEvent_HasCursor 2787 +#define wxSetCursorEvent_SetCursor 2788 +#define wxKeyEvent_AltDown 2789 +#define wxKeyEvent_CmdDown 2790 +#define wxKeyEvent_ControlDown 2791 +#define wxKeyEvent_GetKeyCode 2792 +#define wxKeyEvent_GetModifiers 2793 +#define wxKeyEvent_GetPosition 2796 +#define wxKeyEvent_GetRawKeyCode 2797 +#define wxKeyEvent_GetRawKeyFlags 2798 +#define wxKeyEvent_GetUnicodeKey 2799 +#define wxKeyEvent_GetX 2800 +#define wxKeyEvent_GetY 2801 +#define wxKeyEvent_HasModifiers 2802 +#define wxKeyEvent_MetaDown 2803 +#define wxKeyEvent_ShiftDown 2804 +#define wxSizeEvent_GetSize 2805 +#define wxMoveEvent_GetPosition 2806 +#define wxEraseEvent_GetDC 2807 +#define wxFocusEvent_GetWindow 2808 +#define wxChildFocusEvent_GetWindow 2809 +#define wxMenuEvent_GetMenu 2810 +#define wxMenuEvent_GetMenuId 2811 +#define wxMenuEvent_IsPopup 2812 +#define wxCloseEvent_CanVeto 2813 +#define wxCloseEvent_GetLoggingOff 2814 +#define wxCloseEvent_SetCanVeto 2815 +#define wxCloseEvent_SetLoggingOff 2816 +#define wxCloseEvent_Veto 2817 +#define wxShowEvent_SetShow 2818 +#define wxShowEvent_GetShow 2819 +#define wxIconizeEvent_Iconized 2820 +#define wxJoystickEvent_ButtonDown 2821 +#define wxJoystickEvent_ButtonIsDown 2822 +#define wxJoystickEvent_ButtonUp 2823 +#define wxJoystickEvent_GetButtonChange 2824 +#define wxJoystickEvent_GetButtonState 2825 +#define wxJoystickEvent_GetJoystick 2826 +#define wxJoystickEvent_GetPosition 2827 +#define wxJoystickEvent_GetZPosition 2828 +#define wxJoystickEvent_IsButton 2829 +#define wxJoystickEvent_IsMove 2830 +#define wxJoystickEvent_IsZMove 2831 +#define wxUpdateUIEvent_CanUpdate 2832 +#define wxUpdateUIEvent_Check 2833 +#define wxUpdateUIEvent_Enable 2834 +#define wxUpdateUIEvent_Show 2835 +#define wxUpdateUIEvent_GetChecked 2836 +#define wxUpdateUIEvent_GetEnabled 2837 +#define wxUpdateUIEvent_GetShown 2838 +#define wxUpdateUIEvent_GetSetChecked 2839 +#define wxUpdateUIEvent_GetSetEnabled 2840 +#define wxUpdateUIEvent_GetSetShown 2841 +#define wxUpdateUIEvent_GetSetText 2842 +#define wxUpdateUIEvent_GetText 2843 +#define wxUpdateUIEvent_GetMode 2844 +#define wxUpdateUIEvent_GetUpdateInterval 2845 +#define wxUpdateUIEvent_ResetUpdateTime 2846 +#define wxUpdateUIEvent_SetMode 2847 +#define wxUpdateUIEvent_SetText 2848 +#define wxUpdateUIEvent_SetUpdateInterval 2849 +#define wxMouseCaptureChangedEvent_GetCapturedWindow 2850 +#define wxPaletteChangedEvent_SetChangedWindow 2851 +#define wxPaletteChangedEvent_GetChangedWindow 2852 +#define wxQueryNewPaletteEvent_SetPaletteRealized 2853 +#define wxQueryNewPaletteEvent_GetPaletteRealized 2854 +#define wxNavigationKeyEvent_GetDirection 2855 +#define wxNavigationKeyEvent_SetDirection 2856 +#define wxNavigationKeyEvent_IsWindowChange 2857 +#define wxNavigationKeyEvent_SetWindowChange 2858 +#define wxNavigationKeyEvent_IsFromTab 2859 +#define wxNavigationKeyEvent_SetFromTab 2860 +#define wxNavigationKeyEvent_GetCurrentFocus 2861 +#define wxNavigationKeyEvent_SetCurrentFocus 2862 +#define wxHelpEvent_GetOrigin 2863 +#define wxHelpEvent_GetPosition 2864 +#define wxHelpEvent_SetOrigin 2865 +#define wxHelpEvent_SetPosition 2866 +#define wxContextMenuEvent_GetPosition 2867 +#define wxContextMenuEvent_SetPosition 2868 +#define wxIdleEvent_CanSend 2869 +#define wxIdleEvent_GetMode 2870 +#define wxIdleEvent_RequestMore 2871 +#define wxIdleEvent_MoreRequested 2872 +#define wxIdleEvent_SetMode 2873 +#define wxGridEvent_AltDown 2874 +#define wxGridEvent_ControlDown 2875 +#define wxGridEvent_GetCol 2876 +#define wxGridEvent_GetPosition 2877 +#define wxGridEvent_GetRow 2878 +#define wxGridEvent_MetaDown 2879 +#define wxGridEvent_Selecting 2880 +#define wxGridEvent_ShiftDown 2881 +#define wxNotifyEvent_Allow 2882 +#define wxNotifyEvent_IsAllowed 2883 +#define wxNotifyEvent_Veto 2884 +#define wxSashEvent_GetEdge 2885 +#define wxSashEvent_GetDragRect 2886 +#define wxSashEvent_GetDragStatus 2887 +#define wxListEvent_GetCacheFrom 2888 +#define wxListEvent_GetCacheTo 2889 +#define wxListEvent_GetKeyCode 2890 +#define wxListEvent_GetIndex 2891 +#define wxListEvent_GetColumn 2892 +#define wxListEvent_GetPoint 2893 +#define wxListEvent_GetLabel 2894 +#define wxListEvent_GetText 2895 +#define wxListEvent_GetImage 2896 +#define wxListEvent_GetData 2897 +#define wxListEvent_GetMask 2898 +#define wxListEvent_GetItem 2899 +#define wxListEvent_IsEditCancelled 2900 +#define wxDateEvent_GetDate 2901 +#define wxCalendarEvent_GetWeekDay 2902 +#define wxFileDirPickerEvent_GetPath 2903 +#define wxColourPickerEvent_GetColour 2904 +#define wxFontPickerEvent_GetFont 2905 +#define wxStyledTextEvent_GetPosition 2906 +#define wxStyledTextEvent_GetKey 2907 +#define wxStyledTextEvent_GetModifiers 2908 +#define wxStyledTextEvent_GetModificationType 2909 +#define wxStyledTextEvent_GetText 2910 +#define wxStyledTextEvent_GetLength 2911 +#define wxStyledTextEvent_GetLinesAdded 2912 +#define wxStyledTextEvent_GetLine 2913 +#define wxStyledTextEvent_GetFoldLevelNow 2914 +#define wxStyledTextEvent_GetFoldLevelPrev 2915 +#define wxStyledTextEvent_GetMargin 2916 +#define wxStyledTextEvent_GetMessage 2917 +#define wxStyledTextEvent_GetWParam 2918 +#define wxStyledTextEvent_GetLParam 2919 +#define wxStyledTextEvent_GetListType 2920 +#define wxStyledTextEvent_GetX 2921 +#define wxStyledTextEvent_GetY 2922 +#define wxStyledTextEvent_GetDragText 2923 +#define wxStyledTextEvent_GetDragAllowMove 2924 +#define wxStyledTextEvent_GetDragResult 2925 +#define wxStyledTextEvent_GetShift 2926 +#define wxStyledTextEvent_GetControl 2927 +#define wxStyledTextEvent_GetAlt 2928 +#define utils_wxGetKeyState 2929 +#define utils_wxGetMousePosition 2930 +#define utils_wxGetMouseState 2931 +#define utils_wxSetDetectableAutoRepeat 2932 +#define utils_wxBell 2933 +#define utils_wxFindMenuItemId 2934 +#define utils_wxGenericFindWindowAtPoint 2935 +#define utils_wxFindWindowAtPoint 2936 +#define utils_wxBeginBusyCursor 2937 +#define utils_wxEndBusyCursor 2938 +#define utils_wxIsBusy 2939 +#define utils_wxShutdown 2940 +#define utils_wxShell 2941 +#define utils_wxLaunchDefaultBrowser 2942 +#define utils_wxGetEmailAddress 2943 +#define utils_wxGetUserId 2944 +#define utils_wxGetHomeDir 2945 +#define utils_wxNewId 2946 +#define utils_wxRegisterId 2947 +#define utils_wxGetCurrentId 2948 +#define utils_wxGetOsDescription 2949 +#define utils_wxIsPlatformLittleEndian 2950 +#define utils_wxIsPlatform64Bit 2951 +#define gdicmn_wxDisplaySize 2952 +#define gdicmn_wxSetCursor 2953 +#define wxPrintout_new 2954 +#define wxPrintout_destruct 2955 +#define wxPrintout_GetDC 2956 +#define wxPrintout_GetPageSizeMM 2957 +#define wxPrintout_GetPageSizePixels 2958 +#define wxPrintout_GetPaperRectPixels 2959 +#define wxPrintout_GetPPIPrinter 2960 +#define wxPrintout_GetPPIScreen 2961 +#define wxPrintout_GetTitle 2962 +#define wxPrintout_IsPreview 2963 +#define wxPrintout_FitThisSizeToPaper 2964 +#define wxPrintout_FitThisSizeToPage 2965 +#define wxPrintout_FitThisSizeToPageMargins 2966 +#define wxPrintout_MapScreenSizeToPaper 2967 +#define wxPrintout_MapScreenSizeToPage 2968 +#define wxPrintout_MapScreenSizeToPageMargins 2969 +#define wxPrintout_MapScreenSizeToDevice 2970 +#define wxPrintout_GetLogicalPaperRect 2971 +#define wxPrintout_GetLogicalPageRect 2972 +#define wxPrintout_GetLogicalPageMarginsRect 2973 +#define wxPrintout_SetLogicalOrigin 2974 +#define wxPrintout_OffsetLogicalOrigin 2975 +#define wxStyledTextCtrl_new_2 2976 +#define wxStyledTextCtrl_new_0 2977 +#define wxStyledTextCtrl_destruct 2978 +#define wxStyledTextCtrl_Create 2979 +#define wxStyledTextCtrl_AddText 2980 +#define wxStyledTextCtrl_AddStyledText 2981 +#define wxStyledTextCtrl_InsertText 2982 +#define wxStyledTextCtrl_ClearAll 2983 +#define wxStyledTextCtrl_ClearDocumentStyle 2984 +#define wxStyledTextCtrl_GetLength 2985 +#define wxStyledTextCtrl_GetCharAt 2986 +#define wxStyledTextCtrl_GetCurrentPos 2987 +#define wxStyledTextCtrl_GetAnchor 2988 +#define wxStyledTextCtrl_GetStyleAt 2989 +#define wxStyledTextCtrl_Redo 2990 +#define wxStyledTextCtrl_SetUndoCollection 2991 +#define wxStyledTextCtrl_SelectAll 2992 +#define wxStyledTextCtrl_SetSavePoint 2993 +#define wxStyledTextCtrl_GetStyledText 2994 +#define wxStyledTextCtrl_CanRedo 2995 +#define wxStyledTextCtrl_MarkerLineFromHandle 2996 +#define wxStyledTextCtrl_MarkerDeleteHandle 2997 +#define wxStyledTextCtrl_GetUndoCollection 2998 +#define wxStyledTextCtrl_GetViewWhiteSpace 2999 +#define wxStyledTextCtrl_SetViewWhiteSpace 3000 +#define wxStyledTextCtrl_PositionFromPoint 3001 +#define wxStyledTextCtrl_PositionFromPointClose 3002 +#define wxStyledTextCtrl_GotoLine 3003 +#define wxStyledTextCtrl_GotoPos 3004 +#define wxStyledTextCtrl_SetAnchor 3005 +#define wxStyledTextCtrl_GetCurLine 3006 +#define wxStyledTextCtrl_GetEndStyled 3007 +#define wxStyledTextCtrl_ConvertEOLs 3008 +#define wxStyledTextCtrl_GetEOLMode 3009 +#define wxStyledTextCtrl_SetEOLMode 3010 +#define wxStyledTextCtrl_StartStyling 3011 +#define wxStyledTextCtrl_SetStyling 3012 +#define wxStyledTextCtrl_GetBufferedDraw 3013 +#define wxStyledTextCtrl_SetBufferedDraw 3014 +#define wxStyledTextCtrl_SetTabWidth 3015 +#define wxStyledTextCtrl_GetTabWidth 3016 +#define wxStyledTextCtrl_SetCodePage 3017 +#define wxStyledTextCtrl_MarkerDefine 3018 +#define wxStyledTextCtrl_MarkerSetForeground 3019 +#define wxStyledTextCtrl_MarkerSetBackground 3020 +#define wxStyledTextCtrl_MarkerAdd 3021 +#define wxStyledTextCtrl_MarkerDelete 3022 +#define wxStyledTextCtrl_MarkerDeleteAll 3023 +#define wxStyledTextCtrl_MarkerGet 3024 +#define wxStyledTextCtrl_MarkerNext 3025 +#define wxStyledTextCtrl_MarkerPrevious 3026 +#define wxStyledTextCtrl_MarkerDefineBitmap 3027 +#define wxStyledTextCtrl_MarkerAddSet 3028 +#define wxStyledTextCtrl_MarkerSetAlpha 3029 +#define wxStyledTextCtrl_SetMarginType 3030 +#define wxStyledTextCtrl_GetMarginType 3031 +#define wxStyledTextCtrl_SetMarginWidth 3032 +#define wxStyledTextCtrl_GetMarginWidth 3033 +#define wxStyledTextCtrl_SetMarginMask 3034 +#define wxStyledTextCtrl_GetMarginMask 3035 +#define wxStyledTextCtrl_SetMarginSensitive 3036 +#define wxStyledTextCtrl_GetMarginSensitive 3037 +#define wxStyledTextCtrl_StyleClearAll 3038 +#define wxStyledTextCtrl_StyleSetForeground 3039 +#define wxStyledTextCtrl_StyleSetBackground 3040 +#define wxStyledTextCtrl_StyleSetBold 3041 +#define wxStyledTextCtrl_StyleSetItalic 3042 +#define wxStyledTextCtrl_StyleSetSize 3043 +#define wxStyledTextCtrl_StyleSetFaceName 3044 +#define wxStyledTextCtrl_StyleSetEOLFilled 3045 +#define wxStyledTextCtrl_StyleResetDefault 3046 +#define wxStyledTextCtrl_StyleSetUnderline 3047 +#define wxStyledTextCtrl_StyleSetCase 3048 +#define wxStyledTextCtrl_StyleSetHotSpot 3049 +#define wxStyledTextCtrl_SetSelForeground 3050 +#define wxStyledTextCtrl_SetSelBackground 3051 +#define wxStyledTextCtrl_GetSelAlpha 3052 +#define wxStyledTextCtrl_SetSelAlpha 3053 +#define wxStyledTextCtrl_SetCaretForeground 3054 +#define wxStyledTextCtrl_CmdKeyAssign 3055 +#define wxStyledTextCtrl_CmdKeyClear 3056 +#define wxStyledTextCtrl_CmdKeyClearAll 3057 +#define wxStyledTextCtrl_SetStyleBytes 3058 +#define wxStyledTextCtrl_StyleSetVisible 3059 +#define wxStyledTextCtrl_GetCaretPeriod 3060 +#define wxStyledTextCtrl_SetCaretPeriod 3061 +#define wxStyledTextCtrl_SetWordChars 3062 +#define wxStyledTextCtrl_BeginUndoAction 3063 +#define wxStyledTextCtrl_EndUndoAction 3064 +#define wxStyledTextCtrl_IndicatorSetStyle 3065 +#define wxStyledTextCtrl_IndicatorGetStyle 3066 +#define wxStyledTextCtrl_IndicatorSetForeground 3067 +#define wxStyledTextCtrl_IndicatorGetForeground 3068 +#define wxStyledTextCtrl_SetWhitespaceForeground 3069 +#define wxStyledTextCtrl_SetWhitespaceBackground 3070 +#define wxStyledTextCtrl_GetStyleBits 3071 +#define wxStyledTextCtrl_SetLineState 3072 +#define wxStyledTextCtrl_GetLineState 3073 +#define wxStyledTextCtrl_GetMaxLineState 3074 +#define wxStyledTextCtrl_GetCaretLineVisible 3075 +#define wxStyledTextCtrl_SetCaretLineVisible 3076 +#define wxStyledTextCtrl_GetCaretLineBackground 3077 +#define wxStyledTextCtrl_SetCaretLineBackground 3078 +#define wxStyledTextCtrl_AutoCompShow 3079 +#define wxStyledTextCtrl_AutoCompCancel 3080 +#define wxStyledTextCtrl_AutoCompActive 3081 +#define wxStyledTextCtrl_AutoCompPosStart 3082 +#define wxStyledTextCtrl_AutoCompComplete 3083 +#define wxStyledTextCtrl_AutoCompStops 3084 +#define wxStyledTextCtrl_AutoCompSetSeparator 3085 +#define wxStyledTextCtrl_AutoCompGetSeparator 3086 +#define wxStyledTextCtrl_AutoCompSelect 3087 +#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3088 +#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3089 +#define wxStyledTextCtrl_AutoCompSetFillUps 3090 +#define wxStyledTextCtrl_AutoCompSetChooseSingle 3091 +#define wxStyledTextCtrl_AutoCompGetChooseSingle 3092 +#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3093 +#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3094 +#define wxStyledTextCtrl_UserListShow 3095 +#define wxStyledTextCtrl_AutoCompSetAutoHide 3096 +#define wxStyledTextCtrl_AutoCompGetAutoHide 3097 +#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3098 +#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3099 +#define wxStyledTextCtrl_RegisterImage 3100 +#define wxStyledTextCtrl_ClearRegisteredImages 3101 +#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3102 +#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3103 +#define wxStyledTextCtrl_AutoCompSetMaxWidth 3104 +#define wxStyledTextCtrl_AutoCompGetMaxWidth 3105 +#define wxStyledTextCtrl_AutoCompSetMaxHeight 3106 +#define wxStyledTextCtrl_AutoCompGetMaxHeight 3107 +#define wxStyledTextCtrl_SetIndent 3108 +#define wxStyledTextCtrl_GetIndent 3109 +#define wxStyledTextCtrl_SetUseTabs 3110 +#define wxStyledTextCtrl_GetUseTabs 3111 +#define wxStyledTextCtrl_SetLineIndentation 3112 +#define wxStyledTextCtrl_GetLineIndentation 3113 +#define wxStyledTextCtrl_GetLineIndentPosition 3114 +#define wxStyledTextCtrl_GetColumn 3115 +#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3116 +#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3117 +#define wxStyledTextCtrl_SetIndentationGuides 3118 +#define wxStyledTextCtrl_GetIndentationGuides 3119 +#define wxStyledTextCtrl_SetHighlightGuide 3120 +#define wxStyledTextCtrl_GetHighlightGuide 3121 +#define wxStyledTextCtrl_GetLineEndPosition 3122 +#define wxStyledTextCtrl_GetCodePage 3123 +#define wxStyledTextCtrl_GetCaretForeground 3124 +#define wxStyledTextCtrl_GetReadOnly 3125 +#define wxStyledTextCtrl_SetCurrentPos 3126 +#define wxStyledTextCtrl_SetSelectionStart 3127 +#define wxStyledTextCtrl_GetSelectionStart 3128 +#define wxStyledTextCtrl_SetSelectionEnd 3129 +#define wxStyledTextCtrl_GetSelectionEnd 3130 +#define wxStyledTextCtrl_SetPrintMagnification 3131 +#define wxStyledTextCtrl_GetPrintMagnification 3132 +#define wxStyledTextCtrl_SetPrintColourMode 3133 +#define wxStyledTextCtrl_GetPrintColourMode 3134 +#define wxStyledTextCtrl_FindText 3135 +#define wxStyledTextCtrl_FormatRange 3136 +#define wxStyledTextCtrl_GetFirstVisibleLine 3137 +#define wxStyledTextCtrl_GetLine 3138 +#define wxStyledTextCtrl_GetLineCount 3139 +#define wxStyledTextCtrl_SetMarginLeft 3140 +#define wxStyledTextCtrl_GetMarginLeft 3141 +#define wxStyledTextCtrl_SetMarginRight 3142 +#define wxStyledTextCtrl_GetMarginRight 3143 +#define wxStyledTextCtrl_GetModify 3144 +#define wxStyledTextCtrl_SetSelection 3145 +#define wxStyledTextCtrl_GetSelectedText 3146 +#define wxStyledTextCtrl_GetTextRange 3147 +#define wxStyledTextCtrl_HideSelection 3148 +#define wxStyledTextCtrl_LineFromPosition 3149 +#define wxStyledTextCtrl_PositionFromLine 3150 +#define wxStyledTextCtrl_LineScroll 3151 +#define wxStyledTextCtrl_EnsureCaretVisible 3152 +#define wxStyledTextCtrl_ReplaceSelection 3153 +#define wxStyledTextCtrl_SetReadOnly 3154 +#define wxStyledTextCtrl_CanPaste 3155 +#define wxStyledTextCtrl_CanUndo 3156 +#define wxStyledTextCtrl_EmptyUndoBuffer 3157 +#define wxStyledTextCtrl_Undo 3158 +#define wxStyledTextCtrl_Cut 3159 +#define wxStyledTextCtrl_Copy 3160 +#define wxStyledTextCtrl_Paste 3161 +#define wxStyledTextCtrl_Clear 3162 +#define wxStyledTextCtrl_SetText 3163 +#define wxStyledTextCtrl_GetText 3164 +#define wxStyledTextCtrl_GetTextLength 3165 +#define wxStyledTextCtrl_GetOvertype 3166 +#define wxStyledTextCtrl_SetCaretWidth 3167 +#define wxStyledTextCtrl_GetCaretWidth 3168 +#define wxStyledTextCtrl_SetTargetStart 3169 +#define wxStyledTextCtrl_GetTargetStart 3170 +#define wxStyledTextCtrl_SetTargetEnd 3171 +#define wxStyledTextCtrl_GetTargetEnd 3172 +#define wxStyledTextCtrl_ReplaceTarget 3173 +#define wxStyledTextCtrl_SearchInTarget 3174 +#define wxStyledTextCtrl_SetSearchFlags 3175 +#define wxStyledTextCtrl_GetSearchFlags 3176 +#define wxStyledTextCtrl_CallTipShow 3177 +#define wxStyledTextCtrl_CallTipCancel 3178 +#define wxStyledTextCtrl_CallTipActive 3179 +#define wxStyledTextCtrl_CallTipPosAtStart 3180 +#define wxStyledTextCtrl_CallTipSetHighlight 3181 +#define wxStyledTextCtrl_CallTipSetBackground 3182 +#define wxStyledTextCtrl_CallTipSetForeground 3183 +#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3184 +#define wxStyledTextCtrl_CallTipUseStyle 3185 +#define wxStyledTextCtrl_VisibleFromDocLine 3186 +#define wxStyledTextCtrl_DocLineFromVisible 3187 +#define wxStyledTextCtrl_WrapCount 3188 +#define wxStyledTextCtrl_SetFoldLevel 3189 +#define wxStyledTextCtrl_GetFoldLevel 3190 +#define wxStyledTextCtrl_GetLastChild 3191 +#define wxStyledTextCtrl_GetFoldParent 3192 +#define wxStyledTextCtrl_ShowLines 3193 +#define wxStyledTextCtrl_HideLines 3194 +#define wxStyledTextCtrl_GetLineVisible 3195 +#define wxStyledTextCtrl_SetFoldExpanded 3196 +#define wxStyledTextCtrl_GetFoldExpanded 3197 +#define wxStyledTextCtrl_ToggleFold 3198 +#define wxStyledTextCtrl_EnsureVisible 3199 +#define wxStyledTextCtrl_SetFoldFlags 3200 +#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3201 +#define wxStyledTextCtrl_SetTabIndents 3202 +#define wxStyledTextCtrl_GetTabIndents 3203 +#define wxStyledTextCtrl_SetBackSpaceUnIndents 3204 +#define wxStyledTextCtrl_GetBackSpaceUnIndents 3205 +#define wxStyledTextCtrl_SetMouseDwellTime 3206 +#define wxStyledTextCtrl_GetMouseDwellTime 3207 +#define wxStyledTextCtrl_WordStartPosition 3208 +#define wxStyledTextCtrl_WordEndPosition 3209 +#define wxStyledTextCtrl_SetWrapMode 3210 +#define wxStyledTextCtrl_GetWrapMode 3211 +#define wxStyledTextCtrl_SetWrapVisualFlags 3212 +#define wxStyledTextCtrl_GetWrapVisualFlags 3213 +#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3214 +#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3215 +#define wxStyledTextCtrl_SetWrapStartIndent 3216 +#define wxStyledTextCtrl_GetWrapStartIndent 3217 +#define wxStyledTextCtrl_SetLayoutCache 3218 +#define wxStyledTextCtrl_GetLayoutCache 3219 +#define wxStyledTextCtrl_SetScrollWidth 3220 +#define wxStyledTextCtrl_GetScrollWidth 3221 +#define wxStyledTextCtrl_TextWidth 3222 +#define wxStyledTextCtrl_GetEndAtLastLine 3223 +#define wxStyledTextCtrl_TextHeight 3224 +#define wxStyledTextCtrl_SetUseVerticalScrollBar 3225 +#define wxStyledTextCtrl_GetUseVerticalScrollBar 3226 +#define wxStyledTextCtrl_AppendText 3227 +#define wxStyledTextCtrl_GetTwoPhaseDraw 3228 +#define wxStyledTextCtrl_SetTwoPhaseDraw 3229 +#define wxStyledTextCtrl_TargetFromSelection 3230 +#define wxStyledTextCtrl_LinesJoin 3231 +#define wxStyledTextCtrl_LinesSplit 3232 +#define wxStyledTextCtrl_SetFoldMarginColour 3233 +#define wxStyledTextCtrl_SetFoldMarginHiColour 3234 +#define wxStyledTextCtrl_LineDown 3235 +#define wxStyledTextCtrl_LineDownExtend 3236 +#define wxStyledTextCtrl_LineUp 3237 +#define wxStyledTextCtrl_LineUpExtend 3238 +#define wxStyledTextCtrl_CharLeft 3239 +#define wxStyledTextCtrl_CharLeftExtend 3240 +#define wxStyledTextCtrl_CharRight 3241 +#define wxStyledTextCtrl_CharRightExtend 3242 +#define wxStyledTextCtrl_WordLeft 3243 +#define wxStyledTextCtrl_WordLeftExtend 3244 +#define wxStyledTextCtrl_WordRight 3245 +#define wxStyledTextCtrl_WordRightExtend 3246 +#define wxStyledTextCtrl_Home 3247 +#define wxStyledTextCtrl_HomeExtend 3248 +#define wxStyledTextCtrl_LineEnd 3249 +#define wxStyledTextCtrl_LineEndExtend 3250 +#define wxStyledTextCtrl_DocumentStart 3251 +#define wxStyledTextCtrl_DocumentStartExtend 3252 +#define wxStyledTextCtrl_DocumentEnd 3253 +#define wxStyledTextCtrl_DocumentEndExtend 3254 +#define wxStyledTextCtrl_PageUp 3255 +#define wxStyledTextCtrl_PageUpExtend 3256 +#define wxStyledTextCtrl_PageDown 3257 +#define wxStyledTextCtrl_PageDownExtend 3258 +#define wxStyledTextCtrl_EditToggleOvertype 3259 +#define wxStyledTextCtrl_Cancel 3260 +#define wxStyledTextCtrl_DeleteBack 3261 +#define wxStyledTextCtrl_Tab 3262 +#define wxStyledTextCtrl_BackTab 3263 +#define wxStyledTextCtrl_NewLine 3264 +#define wxStyledTextCtrl_FormFeed 3265 +#define wxStyledTextCtrl_VCHome 3266 +#define wxStyledTextCtrl_VCHomeExtend 3267 +#define wxStyledTextCtrl_ZoomIn 3268 +#define wxStyledTextCtrl_ZoomOut 3269 +#define wxStyledTextCtrl_DelWordLeft 3270 +#define wxStyledTextCtrl_DelWordRight 3271 +#define wxStyledTextCtrl_LineCut 3272 +#define wxStyledTextCtrl_LineDelete 3273 +#define wxStyledTextCtrl_LineTranspose 3274 +#define wxStyledTextCtrl_LineDuplicate 3275 +#define wxStyledTextCtrl_LowerCase 3276 +#define wxStyledTextCtrl_UpperCase 3277 +#define wxStyledTextCtrl_LineScrollDown 3278 +#define wxStyledTextCtrl_LineScrollUp 3279 +#define wxStyledTextCtrl_DeleteBackNotLine 3280 +#define wxStyledTextCtrl_HomeDisplay 3281 +#define wxStyledTextCtrl_HomeDisplayExtend 3282 +#define wxStyledTextCtrl_LineEndDisplay 3283 +#define wxStyledTextCtrl_LineEndDisplayExtend 3284 +#define wxStyledTextCtrl_HomeWrapExtend 3285 +#define wxStyledTextCtrl_LineEndWrap 3286 +#define wxStyledTextCtrl_LineEndWrapExtend 3287 +#define wxStyledTextCtrl_VCHomeWrap 3288 +#define wxStyledTextCtrl_VCHomeWrapExtend 3289 +#define wxStyledTextCtrl_LineCopy 3290 +#define wxStyledTextCtrl_MoveCaretInsideView 3291 +#define wxStyledTextCtrl_LineLength 3292 +#define wxStyledTextCtrl_BraceHighlight 3293 +#define wxStyledTextCtrl_BraceBadLight 3294 +#define wxStyledTextCtrl_BraceMatch 3295 +#define wxStyledTextCtrl_GetViewEOL 3296 +#define wxStyledTextCtrl_SetViewEOL 3297 +#define wxStyledTextCtrl_SetModEventMask 3298 +#define wxStyledTextCtrl_GetEdgeColumn 3299 +#define wxStyledTextCtrl_SetEdgeColumn 3300 +#define wxStyledTextCtrl_SetEdgeMode 3301 +#define wxStyledTextCtrl_GetEdgeMode 3302 +#define wxStyledTextCtrl_GetEdgeColour 3303 +#define wxStyledTextCtrl_SetEdgeColour 3304 +#define wxStyledTextCtrl_SearchAnchor 3305 +#define wxStyledTextCtrl_SearchNext 3306 +#define wxStyledTextCtrl_SearchPrev 3307 +#define wxStyledTextCtrl_LinesOnScreen 3308 +#define wxStyledTextCtrl_UsePopUp 3309 +#define wxStyledTextCtrl_SelectionIsRectangle 3310 +#define wxStyledTextCtrl_SetZoom 3311 +#define wxStyledTextCtrl_GetZoom 3312 +#define wxStyledTextCtrl_GetModEventMask 3313 +#define wxStyledTextCtrl_SetSTCFocus 3314 +#define wxStyledTextCtrl_GetSTCFocus 3315 +#define wxStyledTextCtrl_SetStatus 3316 +#define wxStyledTextCtrl_GetStatus 3317 +#define wxStyledTextCtrl_SetMouseDownCaptures 3318 +#define wxStyledTextCtrl_GetMouseDownCaptures 3319 +#define wxStyledTextCtrl_SetSTCCursor 3320 +#define wxStyledTextCtrl_GetSTCCursor 3321 +#define wxStyledTextCtrl_SetControlCharSymbol 3322 +#define wxStyledTextCtrl_GetControlCharSymbol 3323 +#define wxStyledTextCtrl_WordPartLeft 3324 +#define wxStyledTextCtrl_WordPartLeftExtend 3325 +#define wxStyledTextCtrl_WordPartRight 3326 +#define wxStyledTextCtrl_WordPartRightExtend 3327 +#define wxStyledTextCtrl_SetVisiblePolicy 3328 +#define wxStyledTextCtrl_DelLineLeft 3329 +#define wxStyledTextCtrl_DelLineRight 3330 +#define wxStyledTextCtrl_GetXOffset 3331 +#define wxStyledTextCtrl_ChooseCaretX 3332 +#define wxStyledTextCtrl_SetXCaretPolicy 3333 +#define wxStyledTextCtrl_SetYCaretPolicy 3334 +#define wxStyledTextCtrl_GetPrintWrapMode 3335 +#define wxStyledTextCtrl_SetHotspotActiveForeground 3336 +#define wxStyledTextCtrl_SetHotspotActiveBackground 3337 +#define wxStyledTextCtrl_SetHotspotActiveUnderline 3338 +#define wxStyledTextCtrl_SetHotspotSingleLine 3339 +#define wxStyledTextCtrl_ParaDownExtend 3340 +#define wxStyledTextCtrl_ParaUp 3341 +#define wxStyledTextCtrl_ParaUpExtend 3342 +#define wxStyledTextCtrl_PositionBefore 3343 +#define wxStyledTextCtrl_PositionAfter 3344 +#define wxStyledTextCtrl_CopyRange 3345 +#define wxStyledTextCtrl_CopyText 3346 +#define wxStyledTextCtrl_SetSelectionMode 3347 +#define wxStyledTextCtrl_GetSelectionMode 3348 +#define wxStyledTextCtrl_LineDownRectExtend 3349 +#define wxStyledTextCtrl_LineUpRectExtend 3350 +#define wxStyledTextCtrl_CharLeftRectExtend 3351 +#define wxStyledTextCtrl_CharRightRectExtend 3352 +#define wxStyledTextCtrl_HomeRectExtend 3353 +#define wxStyledTextCtrl_VCHomeRectExtend 3354 +#define wxStyledTextCtrl_LineEndRectExtend 3355 +#define wxStyledTextCtrl_PageUpRectExtend 3356 +#define wxStyledTextCtrl_PageDownRectExtend 3357 +#define wxStyledTextCtrl_StutteredPageUp 3358 +#define wxStyledTextCtrl_StutteredPageUpExtend 3359 +#define wxStyledTextCtrl_StutteredPageDown 3360 +#define wxStyledTextCtrl_StutteredPageDownExtend 3361 +#define wxStyledTextCtrl_WordLeftEnd 3362 +#define wxStyledTextCtrl_WordLeftEndExtend 3363 +#define wxStyledTextCtrl_WordRightEnd 3364 +#define wxStyledTextCtrl_WordRightEndExtend 3365 +#define wxStyledTextCtrl_SetWhitespaceChars 3366 +#define wxStyledTextCtrl_SetCharsDefault 3367 +#define wxStyledTextCtrl_AutoCompGetCurrent 3368 +#define wxStyledTextCtrl_Allocate 3369 +#define wxStyledTextCtrl_FindColumn 3370 +#define wxStyledTextCtrl_GetCaretSticky 3371 +#define wxStyledTextCtrl_SetCaretSticky 3372 +#define wxStyledTextCtrl_ToggleCaretSticky 3373 +#define wxStyledTextCtrl_SetPasteConvertEndings 3374 +#define wxStyledTextCtrl_GetPasteConvertEndings 3375 +#define wxStyledTextCtrl_SelectionDuplicate 3376 +#define wxStyledTextCtrl_SetCaretLineBackAlpha 3377 +#define wxStyledTextCtrl_GetCaretLineBackAlpha 3378 +#define wxStyledTextCtrl_StartRecord 3379 +#define wxStyledTextCtrl_StopRecord 3380 +#define wxStyledTextCtrl_SetLexer 3381 +#define wxStyledTextCtrl_GetLexer 3382 +#define wxStyledTextCtrl_Colourise 3383 +#define wxStyledTextCtrl_SetProperty 3384 +#define wxStyledTextCtrl_SetKeyWords 3385 +#define wxStyledTextCtrl_SetLexerLanguage 3386 +#define wxStyledTextCtrl_GetProperty 3387 +#define wxStyledTextCtrl_GetStyleBitsNeeded 3388 +#define wxStyledTextCtrl_GetCurrentLine 3389 +#define wxStyledTextCtrl_StyleSetSpec 3390 +#define wxStyledTextCtrl_StyleSetFont 3391 +#define wxStyledTextCtrl_StyleSetFontAttr 3392 +#define wxStyledTextCtrl_StyleSetCharacterSet 3393 +#define wxStyledTextCtrl_StyleSetFontEncoding 3394 +#define wxStyledTextCtrl_CmdKeyExecute 3395 +#define wxStyledTextCtrl_SetMargins 3396 +#define wxStyledTextCtrl_GetSelection 3397 +#define wxStyledTextCtrl_PointFromPosition 3398 +#define wxStyledTextCtrl_ScrollToLine 3399 +#define wxStyledTextCtrl_ScrollToColumn 3400 +#define wxStyledTextCtrl_SetVScrollBar 3401 +#define wxStyledTextCtrl_SetHScrollBar 3402 +#define wxStyledTextCtrl_GetLastKeydownProcessed 3403 +#define wxStyledTextCtrl_SetLastKeydownProcessed 3404 +#define wxStyledTextCtrl_SaveFile 3405 +#define wxStyledTextCtrl_LoadFile 3406 +#define wxStyledTextCtrl_DoDragOver 3407 +#define wxStyledTextCtrl_DoDropText 3408 +#define wxStyledTextCtrl_GetUseAntiAliasing 3409 +#define wxStyledTextCtrl_AddTextRaw 3410 +#define wxStyledTextCtrl_InsertTextRaw 3411 +#define wxStyledTextCtrl_GetCurLineRaw 3412 +#define wxStyledTextCtrl_GetLineRaw 3413 +#define wxStyledTextCtrl_GetSelectedTextRaw 3414 +#define wxStyledTextCtrl_GetTextRangeRaw 3415 +#define wxStyledTextCtrl_SetTextRaw 3416 +#define wxStyledTextCtrl_GetTextRaw 3417 +#define wxStyledTextCtrl_AppendTextRaw 3418 +#define wxArtProvider_GetBitmap 3419 +#define wxArtProvider_GetIcon 3420 +#define wxTreeEvent_GetKeyCode 3421 +#define wxTreeEvent_GetItem 3422 +#define wxTreeEvent_GetKeyEvent 3423 +#define wxTreeEvent_GetLabel 3424 +#define wxTreeEvent_GetOldItem 3425 +#define wxTreeEvent_GetPoint 3426 +#define wxTreeEvent_IsEditCancelled 3427 +#define wxTreeEvent_SetToolTip 3428 +#define wxNotebookEvent_GetOldSelection 3429 +#define wxNotebookEvent_GetSelection 3430 +#define wxNotebookEvent_SetOldSelection 3431 +#define wxNotebookEvent_SetSelection 3432 +#define wxFileDataObject_new 3433 +#define wxFileDataObject_AddFile 3434 +#define wxFileDataObject_GetFilenames 3435 +#define wxFileDataObject_destroy 3436 +#define wxTextDataObject_new 3437 +#define wxTextDataObject_GetTextLength 3438 +#define wxTextDataObject_GetText 3439 +#define wxTextDataObject_SetText 3440 +#define wxTextDataObject_destroy 3441 +#define wxBitmapDataObject_new_1_1 3442 +#define wxBitmapDataObject_new_1_0 3443 +#define wxBitmapDataObject_GetBitmap 3444 +#define wxBitmapDataObject_SetBitmap 3445 +#define wxBitmapDataObject_destroy 3446 +#define wxClipboard_new 3448 +#define wxClipboard_destruct 3449 +#define wxClipboard_AddData 3450 +#define wxClipboard_Clear 3451 +#define wxClipboard_Close 3452 +#define wxClipboard_Flush 3453 +#define wxClipboard_GetData 3454 +#define wxClipboard_IsOpened 3455 +#define wxClipboard_Open 3456 +#define wxClipboard_SetData 3457 +#define wxClipboard_UsePrimarySelection 3459 +#define wxClipboard_IsSupported 3460 +#define wxClipboard_Get 3461 +#define wxSpinEvent_GetPosition 3462 +#define wxSpinEvent_SetPosition 3463 +#define wxSplitterWindow_new_0 3464 +#define wxSplitterWindow_new_2 3465 +#define wxSplitterWindow_destruct 3466 +#define wxSplitterWindow_Create 3467 +#define wxSplitterWindow_GetMinimumPaneSize 3468 +#define wxSplitterWindow_GetSashGravity 3469 +#define wxSplitterWindow_GetSashPosition 3470 +#define wxSplitterWindow_GetSplitMode 3471 +#define wxSplitterWindow_GetWindow1 3472 +#define wxSplitterWindow_GetWindow2 3473 +#define wxSplitterWindow_Initialize 3474 +#define wxSplitterWindow_IsSplit 3475 +#define wxSplitterWindow_ReplaceWindow 3476 +#define wxSplitterWindow_SetSashGravity 3477 +#define wxSplitterWindow_SetSashPosition 3478 +#define wxSplitterWindow_SetSashSize 3479 +#define wxSplitterWindow_SetMinimumPaneSize 3480 +#define wxSplitterWindow_SetSplitMode 3481 +#define wxSplitterWindow_SplitHorizontally 3482 +#define wxSplitterWindow_SplitVertically 3483 +#define wxSplitterWindow_Unsplit 3484 +#define wxSplitterWindow_UpdateSize 3485 +#define wxSplitterEvent_GetSashPosition 3486 +#define wxSplitterEvent_GetX 3487 +#define wxSplitterEvent_GetY 3488 +#define wxSplitterEvent_GetWindowBeingRemoved 3489 +#define wxSplitterEvent_SetSashPosition 3490 +#define wxHtmlWindow_new_0 3491 +#define wxHtmlWindow_new_2 3492 +#define wxHtmlWindow_AppendToPage 3493 +#define wxHtmlWindow_GetOpenedAnchor 3494 +#define wxHtmlWindow_GetOpenedPage 3495 +#define wxHtmlWindow_GetOpenedPageTitle 3496 +#define wxHtmlWindow_GetRelatedFrame 3497 +#define wxHtmlWindow_HistoryBack 3498 +#define wxHtmlWindow_HistoryCanBack 3499 +#define wxHtmlWindow_HistoryCanForward 3500 +#define wxHtmlWindow_HistoryClear 3501 +#define wxHtmlWindow_HistoryForward 3502 +#define wxHtmlWindow_LoadFile 3503 +#define wxHtmlWindow_LoadPage 3504 +#define wxHtmlWindow_SelectAll 3505 +#define wxHtmlWindow_SelectionToText 3506 +#define wxHtmlWindow_SelectLine 3507 +#define wxHtmlWindow_SelectWord 3508 +#define wxHtmlWindow_SetBorders 3509 +#define wxHtmlWindow_SetFonts 3510 +#define wxHtmlWindow_SetPage 3511 +#define wxHtmlWindow_SetRelatedFrame 3512 +#define wxHtmlWindow_SetRelatedStatusBar 3513 +#define wxHtmlWindow_ToText 3514 +#define wxHtmlWindow_destroy 3515 +#define wxHtmlLinkEvent_GetLinkInfo 3516 +#define wxSystemSettings_GetColour 3517 +#define wxSystemSettings_GetFont 3518 +#define wxSystemSettings_GetMetric 3519 +#define wxSystemSettings_GetScreenType 3520 +#define wxSystemOptions_GetOption 3521 +#define wxSystemOptions_GetOptionInt 3522 +#define wxSystemOptions_HasOption 3523 +#define wxSystemOptions_IsFalse 3524 +#define wxSystemOptions_SetOption_2_1 3525 +#define wxSystemOptions_SetOption_2_0 3526 +#define wxAuiNotebookEvent_SetSelection 3527 +#define wxAuiNotebookEvent_GetSelection 3528 +#define wxAuiNotebookEvent_SetOldSelection 3529 +#define wxAuiNotebookEvent_GetOldSelection 3530 +#define wxAuiNotebookEvent_SetDragSource 3531 +#define wxAuiNotebookEvent_GetDragSource 3532 +#define wxAuiManagerEvent_SetManager 3533 +#define wxAuiManagerEvent_GetManager 3534 +#define wxAuiManagerEvent_SetPane 3535 +#define wxAuiManagerEvent_GetPane 3536 +#define wxAuiManagerEvent_SetButton 3537 +#define wxAuiManagerEvent_GetButton 3538 +#define wxAuiManagerEvent_SetDC 3539 +#define wxAuiManagerEvent_GetDC 3540 +#define wxAuiManagerEvent_Veto 3541 +#define wxAuiManagerEvent_GetVeto 3542 +#define wxAuiManagerEvent_SetCanVeto 3543 +#define wxAuiManagerEvent_CanVeto 3544 +#define wxLogNull_new 3545 +#define wxLogNull_destroy 3546 +#define wxTaskBarIcon_new 3547 +#define wxTaskBarIcon_destruct 3548 +#define wxTaskBarIcon_PopupMenu 3549 +#define wxTaskBarIcon_RemoveIcon 3550 +#define wxTaskBarIcon_SetIcon 3551 +#define wxLocale_new_0 3552 +#define wxLocale_new_2 3554 +#define wxLocale_destruct 3555 +#define wxLocale_Init 3557 +#define wxLocale_AddCatalog_1 3558 +#define wxLocale_AddCatalog_3 3559 +#define wxLocale_AddCatalogLookupPathPrefix 3560 +#define wxLocale_GetCanonicalName 3561 +#define wxLocale_GetLanguage 3562 +#define wxLocale_GetLanguageName 3563 +#define wxLocale_GetLocale 3564 +#define wxLocale_GetName 3565 +#define wxLocale_GetString_2 3566 +#define wxLocale_GetString_4 3567 +#define wxLocale_GetHeaderValue 3568 +#define wxLocale_GetSysName 3569 +#define wxLocale_GetSystemEncoding 3570 +#define wxLocale_GetSystemEncodingName 3571 +#define wxLocale_GetSystemLanguage 3572 +#define wxLocale_IsLoaded 3573 +#define wxLocale_IsOk 3574 +#define wxActivateEvent_GetActive 3575 +#define wxPopupWindow_new_2 3577 +#define wxPopupWindow_new_0 3578 +#define wxPopupWindow_destruct 3580 +#define wxPopupWindow_Create 3581 +#define wxPopupWindow_Position 3582 +#define wxPopupTransientWindow_new_0 3583 +#define wxPopupTransientWindow_new_2 3584 +#define wxPopupTransientWindow_destruct 3585 +#define wxPopupTransientWindow_Popup 3586 +#define wxPopupTransientWindow_Dismiss 3587 +#define wxOverlay_new 3588 +#define wxOverlay_destruct 3589 +#define wxOverlay_Reset 3590 +#define wxDCOverlay_new_6 3591 +#define wxDCOverlay_new_2 3592 +#define wxDCOverlay_destruct 3593 +#define wxDCOverlay_Clear 3594 diff --git a/lib/wx/c_src/wxe_main.cpp b/lib/wx/c_src/wxe_main.cpp index b928eb9567..6fcde42eb5 100644 --- a/lib/wx/c_src/wxe_main.cpp +++ b/lib/wx/c_src/wxe_main.cpp @@ -125,8 +125,8 @@ void *wxe_main_loop(void *vpdl) { int result; int argc = 1; - char * temp = (char *) "Erlang"; - char * argv[] = {temp,NULL}; + const wxChar temp[10] = L"Erlang"; + wxChar * argv[] = {(wxChar *)temp, NULL}; ErlDrvPDL pdl = (ErlDrvPDL) vpdl; driver_pdl_inc_refc(pdl); diff --git a/lib/wx/examples/demo/ex_canvas.erl b/lib/wx/examples/demo/ex_canvas.erl index 2a95ea0777..b00ce81993 100644 --- a/lib/wx/examples/demo/ex_canvas.erl +++ b/lib/wx/examples/demo/ex_canvas.erl @@ -136,11 +136,14 @@ handle_event(#wx{event = #wxCommand{type = command_button_clicked}}, {noreply, State}; handle_event(#wx{event = #wxSize{size={W,H}}}, State = #state{bitmap=Prev, canvas=Canvas}) -> - Bitmap = wxBitmap:new(W,H), - draw(Canvas, Bitmap, fun(DC) -> wxDC:clear(DC) end), - wxBitmap:destroy(Prev), - {noreply, State#state{bitmap = Bitmap}}; - + if W > 0 andalso H > 0 -> + Bitmap = wxBitmap:new(W,H), + draw(Canvas, Bitmap, fun(DC) -> wxDC:clear(DC) end), + wxBitmap:destroy(Prev), + {noreply, State#state{bitmap = Bitmap}}; + true -> + {noreply, State} + end; handle_event(#wx{event = #wxMouse{type=left_down, x=X, y=Y}}, State) -> {noreply, State#state{pos={X,Y}}}; handle_event(#wx{event = #wxMouse{type=motion, x=X1, y=Y1}}, diff --git a/lib/wx/examples/demo/ex_canvas_paint.erl b/lib/wx/examples/demo/ex_canvas_paint.erl index aa510f5342..75eb840b04 100644 --- a/lib/wx/examples/demo/ex_canvas_paint.erl +++ b/lib/wx/examples/demo/ex_canvas_paint.erl @@ -157,10 +157,15 @@ handle_event(#wx{event = #wxMouse{type = motion, x = X, y = Y}}, {noreply, State#state{old_pos = {X,Y}}}; %% Resize event handle_event(#wx{event = #wxSize{size = {W,H}}}, State = #state{bitmap=Prev}) -> - wxBitmap:destroy(Prev), - Bitmap = wxBitmap:new(W,H), - draw(State#state.canvas, Bitmap, fun(DC) -> wxDC:clear(DC) end), - {noreply, State#state{bitmap=Bitmap}}; + case W > 0 andalso H > 0 of + true -> + wxBitmap:destroy(Prev), + Bitmap = wxBitmap:new(W,H), + draw(State#state.canvas, Bitmap, fun(DC) -> wxDC:clear(DC) end), + {noreply, State#state{bitmap=Bitmap}}; + false -> + {noreply, State} + end; handle_event(#wx{event = #wxMouse{type = left_dclick,x = X,y = Y}}, State = #state{}) -> wxPanel:connect(State#state.canvas, motion), {noreply, State#state{old_pos = {X,Y}}}; @@ -235,11 +240,10 @@ draw(Canvas, Bitmap, Fun) -> CDC = wxClientDC:new(Canvas), Fun(MemoryDC), - wxDC:blit(CDC, {0,0}, {wxBitmap:getWidth(Bitmap), wxBitmap:getHeight(Bitmap)}, MemoryDC, {0,0}), - + wxClientDC:destroy(CDC), wxMemoryDC:destroy(MemoryDC). diff --git a/lib/wx/src/gen/wxGauge.erl b/lib/wx/src/gen/wxGauge.erl index 51c35145c4..2745e251b4 100644 --- a/lib/wx/src/gen/wxGauge.erl +++ b/lib/wx/src/gen/wxGauge.erl @@ -30,9 +30,8 @@ -module(wxGauge). -include("wxe.hrl"). --export([create/4,create/5,destroy/1,getBezelFace/1,getRange/1,getShadowWidth/1, - getValue/1,isVertical/1,new/0,new/3,new/4,pulse/1,setBezelFace/2,setRange/2, - setShadowWidth/2,setValue/2]). +-export([create/4,create/5,destroy/1,getRange/1,getValue/1,isVertical/1,new/0, + new/3,new/4,pulse/1,setRange/2,setValue/2]). %% inherited exports -export([cacheBestSize/2,canSetTransparent/1,captureMouse/1,center/1,center/2, @@ -142,14 +141,6 @@ create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Ra wxe_util:call(?wxGauge_Create, <<ThisRef:32/?UI,ParentRef:32/?UI,Id:32/?UI,Range:32/?UI, BinOpt/binary>>). -%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugegetbezelface">external documentation</a>. --spec getBezelFace(This) -> integer() when - This::wxGauge(). -getBezelFace(#wx_ref{type=ThisT,ref=ThisRef}) -> - ?CLASS(ThisT,wxGauge), - wxe_util:call(?wxGauge_GetBezelFace, - <<ThisRef:32/?UI>>). - %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugegetrange">external documentation</a>. -spec getRange(This) -> integer() when This::wxGauge(). @@ -158,14 +149,6 @@ getRange(#wx_ref{type=ThisT,ref=ThisRef}) -> wxe_util:call(?wxGauge_GetRange, <<ThisRef:32/?UI>>). -%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugegetshadowwidth">external documentation</a>. --spec getShadowWidth(This) -> integer() when - This::wxGauge(). -getShadowWidth(#wx_ref{type=ThisT,ref=ThisRef}) -> - ?CLASS(ThisT,wxGauge), - wxe_util:call(?wxGauge_GetShadowWidth, - <<ThisRef:32/?UI>>). - %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugegetvalue">external documentation</a>. -spec getValue(This) -> integer() when This::wxGauge(). @@ -182,15 +165,6 @@ isVertical(#wx_ref{type=ThisT,ref=ThisRef}) -> wxe_util:call(?wxGauge_IsVertical, <<ThisRef:32/?UI>>). -%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugesetbezelface">external documentation</a>. --spec setBezelFace(This, W) -> ok when - This::wxGauge(), W::integer(). -setBezelFace(#wx_ref{type=ThisT,ref=ThisRef},W) - when is_integer(W) -> - ?CLASS(ThisT,wxGauge), - wxe_util:cast(?wxGauge_SetBezelFace, - <<ThisRef:32/?UI,W:32/?UI>>). - %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugesetrange">external documentation</a>. -spec setRange(This, R) -> ok when This::wxGauge(), R::integer(). @@ -200,15 +174,6 @@ setRange(#wx_ref{type=ThisT,ref=ThisRef},R) wxe_util:cast(?wxGauge_SetRange, <<ThisRef:32/?UI,R:32/?UI>>). -%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugesetshadowwidth">external documentation</a>. --spec setShadowWidth(This, W) -> ok when - This::wxGauge(), W::integer(). -setShadowWidth(#wx_ref{type=ThisT,ref=ThisRef},W) - when is_integer(W) -> - ?CLASS(ThisT,wxGauge), - wxe_util:cast(?wxGauge_SetShadowWidth, - <<ThisRef:32/?UI,W:32/?UI>>). - %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxgauge.html#wxgaugesetvalue">external documentation</a>. -spec setValue(This, Pos) -> ok when This::wxGauge(), Pos::integer(). diff --git a/lib/wx/src/gen/wxe_debug.hrl b/lib/wx/src/gen/wxe_debug.hrl index 2ec485cd52..78c6577439 100644 --- a/lib/wx/src/gen/wxe_debug.hrl +++ b/lib/wx/src/gen/wxe_debug.hrl @@ -1457,1925 +1457,1921 @@ wxdebug_table() -> {1602, {wxGauge, new_0, 0}}, {1603, {wxGauge, new_4, 4}}, {1604, {wxGauge, create, 4}}, - {1605, {wxGauge, getBezelFace, 0}}, - {1606, {wxGauge, getRange, 0}}, - {1607, {wxGauge, getShadowWidth, 0}}, - {1608, {wxGauge, getValue, 0}}, - {1609, {wxGauge, isVertical, 0}}, - {1610, {wxGauge, setBezelFace, 1}}, - {1611, {wxGauge, setRange, 1}}, - {1612, {wxGauge, setShadowWidth, 1}}, - {1613, {wxGauge, setValue, 1}}, - {1614, {wxGauge, pulse, 0}}, - {1615, {wxGauge, 'Destroy', undefined}}, - {1616, {wxGenericDirCtrl, new_0, 0}}, - {1617, {wxGenericDirCtrl, new_2, 2}}, - {1618, {wxGenericDirCtrl, destruct, 0}}, - {1619, {wxGenericDirCtrl, create, 2}}, - {1620, {wxGenericDirCtrl, init, 0}}, - {1621, {wxGenericDirCtrl, collapseTree, 0}}, - {1622, {wxGenericDirCtrl, expandPath, 1}}, - {1623, {wxGenericDirCtrl, getDefaultPath, 0}}, - {1624, {wxGenericDirCtrl, getPath, 0}}, - {1625, {wxGenericDirCtrl, getFilePath, 0}}, - {1626, {wxGenericDirCtrl, getFilter, 0}}, - {1627, {wxGenericDirCtrl, getFilterIndex, 0}}, - {1628, {wxGenericDirCtrl, getRootId, 0}}, - {1629, {wxGenericDirCtrl, getTreeCtrl, 0}}, - {1630, {wxGenericDirCtrl, reCreateTree, 0}}, - {1631, {wxGenericDirCtrl, setDefaultPath, 1}}, - {1632, {wxGenericDirCtrl, setFilter, 1}}, - {1633, {wxGenericDirCtrl, setFilterIndex, 1}}, - {1634, {wxGenericDirCtrl, setPath, 1}}, - {1636, {wxStaticBox, new_4, 4}}, - {1637, {wxStaticBox, new_0, 0}}, - {1638, {wxStaticBox, create, 4}}, - {1639, {wxStaticBox, 'Destroy', undefined}}, - {1641, {wxStaticLine, new_2, 2}}, - {1642, {wxStaticLine, new_0, 0}}, - {1643, {wxStaticLine, create, 2}}, - {1644, {wxStaticLine, isVertical, 0}}, - {1645, {wxStaticLine, getDefaultSize, 0}}, - {1646, {wxStaticLine, 'Destroy', undefined}}, - {1649, {wxListBox, new_3, 3}}, - {1650, {wxListBox, new_0, 0}}, - {1652, {wxListBox, destruct, 0}}, - {1654, {wxListBox, create, 6}}, - {1655, {wxListBox, deselect, 1}}, - {1656, {wxListBox, getSelections, 1}}, - {1657, {wxListBox, insertItems, 2}}, - {1658, {wxListBox, isSelected, 1}}, - {1659, {wxListBox, set, 1}}, - {1660, {wxListBox, hitTest, 1}}, - {1661, {wxListBox, setFirstItem_1_0, 1}}, - {1662, {wxListBox, setFirstItem_1_1, 1}}, - {1663, {wxListCtrl, new_0, 0}}, - {1664, {wxListCtrl, new_2, 2}}, - {1665, {wxListCtrl, arrange, 1}}, - {1666, {wxListCtrl, assignImageList, 2}}, - {1667, {wxListCtrl, clearAll, 0}}, - {1668, {wxListCtrl, create, 2}}, - {1669, {wxListCtrl, deleteAllItems, 0}}, - {1670, {wxListCtrl, deleteColumn, 1}}, - {1671, {wxListCtrl, deleteItem, 1}}, - {1672, {wxListCtrl, editLabel, 1}}, - {1673, {wxListCtrl, ensureVisible, 1}}, - {1674, {wxListCtrl, findItem_3_0, 3}}, - {1675, {wxListCtrl, findItem_3_1, 3}}, - {1676, {wxListCtrl, getColumn, 2}}, - {1677, {wxListCtrl, getColumnCount, 0}}, - {1678, {wxListCtrl, getColumnWidth, 1}}, - {1679, {wxListCtrl, getCountPerPage, 0}}, - {1680, {wxListCtrl, getEditControl, 0}}, - {1681, {wxListCtrl, getImageList, 1}}, - {1682, {wxListCtrl, getItem, 1}}, - {1683, {wxListCtrl, getItemBackgroundColour, 1}}, - {1684, {wxListCtrl, getItemCount, 0}}, - {1685, {wxListCtrl, getItemData, 1}}, - {1686, {wxListCtrl, getItemFont, 1}}, - {1687, {wxListCtrl, getItemPosition, 2}}, - {1688, {wxListCtrl, getItemRect, 3}}, - {1689, {wxListCtrl, getItemSpacing, 0}}, - {1690, {wxListCtrl, getItemState, 2}}, - {1691, {wxListCtrl, getItemText, 1}}, - {1692, {wxListCtrl, getItemTextColour, 1}}, - {1693, {wxListCtrl, getNextItem, 2}}, - {1694, {wxListCtrl, getSelectedItemCount, 0}}, - {1695, {wxListCtrl, getTextColour, 0}}, - {1696, {wxListCtrl, getTopItem, 0}}, - {1697, {wxListCtrl, getViewRect, 0}}, - {1698, {wxListCtrl, hitTest, 3}}, - {1699, {wxListCtrl, insertColumn_2, 2}}, - {1700, {wxListCtrl, insertColumn_3, 3}}, - {1701, {wxListCtrl, insertItem_1, 1}}, - {1702, {wxListCtrl, insertItem_2_1, 2}}, - {1703, {wxListCtrl, insertItem_2_0, 2}}, - {1704, {wxListCtrl, insertItem_3, 3}}, - {1705, {wxListCtrl, refreshItem, 1}}, - {1706, {wxListCtrl, refreshItems, 2}}, - {1707, {wxListCtrl, scrollList, 2}}, - {1708, {wxListCtrl, setBackgroundColour, 1}}, - {1709, {wxListCtrl, setColumn, 2}}, - {1710, {wxListCtrl, setColumnWidth, 2}}, - {1711, {wxListCtrl, setImageList, 2}}, - {1712, {wxListCtrl, setItem_1, 1}}, - {1713, {wxListCtrl, setItem_4, 4}}, - {1714, {wxListCtrl, setItemBackgroundColour, 2}}, - {1715, {wxListCtrl, setItemCount, 1}}, - {1716, {wxListCtrl, setItemData, 2}}, - {1717, {wxListCtrl, setItemFont, 2}}, - {1718, {wxListCtrl, setItemImage, 3}}, - {1719, {wxListCtrl, setItemColumnImage, 3}}, - {1720, {wxListCtrl, setItemPosition, 2}}, - {1721, {wxListCtrl, setItemState, 3}}, - {1722, {wxListCtrl, setItemText, 2}}, - {1723, {wxListCtrl, setItemTextColour, 2}}, - {1724, {wxListCtrl, setSingleStyle, 2}}, - {1725, {wxListCtrl, setTextColour, 1}}, - {1726, {wxListCtrl, setWindowStyleFlag, 1}}, - {1727, {wxListCtrl, sortItems, 2}}, - {1728, {wxListCtrl, 'Destroy', undefined}}, - {1729, {wxListView, clearColumnImage, 1}}, - {1730, {wxListView, focus, 1}}, - {1731, {wxListView, getFirstSelected, 0}}, - {1732, {wxListView, getFocusedItem, 0}}, - {1733, {wxListView, getNextSelected, 1}}, - {1734, {wxListView, isSelected, 1}}, - {1735, {wxListView, select, 2}}, - {1736, {wxListView, setColumnImage, 2}}, - {1737, {wxListItem, new_0, 0}}, - {1738, {wxListItem, new_1, 1}}, - {1739, {wxListItem, destruct, 0}}, - {1740, {wxListItem, clear, 0}}, - {1741, {wxListItem, getAlign, 0}}, - {1742, {wxListItem, getBackgroundColour, 0}}, - {1743, {wxListItem, getColumn, 0}}, - {1744, {wxListItem, getFont, 0}}, - {1745, {wxListItem, getId, 0}}, - {1746, {wxListItem, getImage, 0}}, - {1747, {wxListItem, getMask, 0}}, - {1748, {wxListItem, getState, 0}}, - {1749, {wxListItem, getText, 0}}, - {1750, {wxListItem, getTextColour, 0}}, - {1751, {wxListItem, getWidth, 0}}, - {1752, {wxListItem, setAlign, 1}}, - {1753, {wxListItem, setBackgroundColour, 1}}, - {1754, {wxListItem, setColumn, 1}}, - {1755, {wxListItem, setFont, 1}}, - {1756, {wxListItem, setId, 1}}, - {1757, {wxListItem, setImage, 1}}, - {1758, {wxListItem, setMask, 1}}, - {1759, {wxListItem, setState, 1}}, - {1760, {wxListItem, setStateMask, 1}}, - {1761, {wxListItem, setText, 1}}, - {1762, {wxListItem, setTextColour, 1}}, - {1763, {wxListItem, setWidth, 1}}, - {1764, {wxListItemAttr, new_0, 0}}, - {1765, {wxListItemAttr, new_3, 3}}, - {1766, {wxListItemAttr, getBackgroundColour, 0}}, - {1767, {wxListItemAttr, getFont, 0}}, - {1768, {wxListItemAttr, getTextColour, 0}}, - {1769, {wxListItemAttr, hasBackgroundColour, 0}}, - {1770, {wxListItemAttr, hasFont, 0}}, - {1771, {wxListItemAttr, hasTextColour, 0}}, - {1772, {wxListItemAttr, setBackgroundColour, 1}}, - {1773, {wxListItemAttr, setFont, 1}}, - {1774, {wxListItemAttr, setTextColour, 1}}, - {1775, {wxListItemAttr, 'Destroy', undefined}}, - {1776, {wxImageList, new_0, 0}}, - {1777, {wxImageList, new_3, 3}}, - {1778, {wxImageList, add_1, 1}}, - {1779, {wxImageList, add_2_0, 2}}, - {1780, {wxImageList, add_2_1, 2}}, - {1781, {wxImageList, create, 3}}, - {1783, {wxImageList, draw, 5}}, - {1784, {wxImageList, getBitmap, 1}}, - {1785, {wxImageList, getIcon, 1}}, - {1786, {wxImageList, getImageCount, 0}}, - {1787, {wxImageList, getSize, 3}}, - {1788, {wxImageList, remove, 1}}, - {1789, {wxImageList, removeAll, 0}}, - {1790, {wxImageList, replace_2, 2}}, - {1791, {wxImageList, replace_3, 3}}, - {1792, {wxImageList, 'Destroy', undefined}}, - {1793, {wxTextAttr, new_0, 0}}, - {1794, {wxTextAttr, new_2, 2}}, - {1795, {wxTextAttr, getAlignment, 0}}, - {1796, {wxTextAttr, getBackgroundColour, 0}}, - {1797, {wxTextAttr, getFont, 0}}, - {1798, {wxTextAttr, getLeftIndent, 0}}, - {1799, {wxTextAttr, getLeftSubIndent, 0}}, - {1800, {wxTextAttr, getRightIndent, 0}}, - {1801, {wxTextAttr, getTabs, 0}}, - {1802, {wxTextAttr, getTextColour, 0}}, - {1803, {wxTextAttr, hasBackgroundColour, 0}}, - {1804, {wxTextAttr, hasFont, 0}}, - {1805, {wxTextAttr, hasTextColour, 0}}, - {1806, {wxTextAttr, getFlags, 0}}, - {1807, {wxTextAttr, isDefault, 0}}, - {1808, {wxTextAttr, setAlignment, 1}}, - {1809, {wxTextAttr, setBackgroundColour, 1}}, - {1810, {wxTextAttr, setFlags, 1}}, - {1811, {wxTextAttr, setFont, 2}}, - {1812, {wxTextAttr, setLeftIndent, 2}}, - {1813, {wxTextAttr, setRightIndent, 1}}, - {1814, {wxTextAttr, setTabs, 1}}, - {1815, {wxTextAttr, setTextColour, 1}}, - {1816, {wxTextAttr, 'Destroy', undefined}}, - {1818, {wxTextCtrl, new_3, 3}}, - {1819, {wxTextCtrl, new_0, 0}}, - {1821, {wxTextCtrl, destruct, 0}}, - {1822, {wxTextCtrl, appendText, 1}}, - {1823, {wxTextCtrl, canCopy, 0}}, - {1824, {wxTextCtrl, canCut, 0}}, - {1825, {wxTextCtrl, canPaste, 0}}, - {1826, {wxTextCtrl, canRedo, 0}}, - {1827, {wxTextCtrl, canUndo, 0}}, - {1828, {wxTextCtrl, clear, 0}}, - {1829, {wxTextCtrl, copy, 0}}, - {1830, {wxTextCtrl, create, 3}}, - {1831, {wxTextCtrl, cut, 0}}, - {1832, {wxTextCtrl, discardEdits, 0}}, - {1833, {wxTextCtrl, changeValue, 1}}, - {1834, {wxTextCtrl, emulateKeyPress, 1}}, - {1835, {wxTextCtrl, getDefaultStyle, 0}}, - {1836, {wxTextCtrl, getInsertionPoint, 0}}, - {1837, {wxTextCtrl, getLastPosition, 0}}, - {1838, {wxTextCtrl, getLineLength, 1}}, - {1839, {wxTextCtrl, getLineText, 1}}, - {1840, {wxTextCtrl, getNumberOfLines, 0}}, - {1841, {wxTextCtrl, getRange, 2}}, - {1842, {wxTextCtrl, getSelection, 2}}, - {1843, {wxTextCtrl, getStringSelection, 0}}, - {1844, {wxTextCtrl, getStyle, 2}}, - {1845, {wxTextCtrl, getValue, 0}}, - {1846, {wxTextCtrl, isEditable, 0}}, - {1847, {wxTextCtrl, isModified, 0}}, - {1848, {wxTextCtrl, isMultiLine, 0}}, - {1849, {wxTextCtrl, isSingleLine, 0}}, - {1850, {wxTextCtrl, loadFile, 2}}, - {1851, {wxTextCtrl, markDirty, 0}}, - {1852, {wxTextCtrl, paste, 0}}, - {1853, {wxTextCtrl, positionToXY, 3}}, - {1854, {wxTextCtrl, redo, 0}}, - {1855, {wxTextCtrl, remove, 2}}, - {1856, {wxTextCtrl, replace, 3}}, - {1857, {wxTextCtrl, saveFile, 1}}, - {1858, {wxTextCtrl, setDefaultStyle, 1}}, - {1859, {wxTextCtrl, setEditable, 1}}, - {1860, {wxTextCtrl, setInsertionPoint, 1}}, - {1861, {wxTextCtrl, setInsertionPointEnd, 0}}, - {1863, {wxTextCtrl, setMaxLength, 1}}, - {1864, {wxTextCtrl, setSelection, 2}}, - {1865, {wxTextCtrl, setStyle, 3}}, - {1866, {wxTextCtrl, setValue, 1}}, - {1867, {wxTextCtrl, showPosition, 1}}, - {1868, {wxTextCtrl, undo, 0}}, - {1869, {wxTextCtrl, writeText, 1}}, - {1870, {wxTextCtrl, xYToPosition, 2}}, - {1873, {wxNotebook, new_0, 0}}, - {1874, {wxNotebook, new_3, 3}}, - {1875, {wxNotebook, destruct, 0}}, - {1876, {wxNotebook, addPage, 3}}, - {1877, {wxNotebook, advanceSelection, 1}}, - {1878, {wxNotebook, assignImageList, 1}}, - {1879, {wxNotebook, create, 3}}, - {1880, {wxNotebook, deleteAllPages, 0}}, - {1881, {wxNotebook, deletePage, 1}}, - {1882, {wxNotebook, removePage, 1}}, - {1883, {wxNotebook, getCurrentPage, 0}}, - {1884, {wxNotebook, getImageList, 0}}, - {1886, {wxNotebook, getPage, 1}}, - {1887, {wxNotebook, getPageCount, 0}}, - {1888, {wxNotebook, getPageImage, 1}}, - {1889, {wxNotebook, getPageText, 1}}, - {1890, {wxNotebook, getRowCount, 0}}, - {1891, {wxNotebook, getSelection, 0}}, - {1892, {wxNotebook, getThemeBackgroundColour, 0}}, - {1894, {wxNotebook, hitTest, 2}}, - {1896, {wxNotebook, insertPage, 4}}, - {1897, {wxNotebook, setImageList, 1}}, - {1898, {wxNotebook, setPadding, 1}}, - {1899, {wxNotebook, setPageSize, 1}}, - {1900, {wxNotebook, setPageImage, 2}}, - {1901, {wxNotebook, setPageText, 2}}, - {1902, {wxNotebook, setSelection, 1}}, - {1903, {wxNotebook, changeSelection, 1}}, - {1904, {wxChoicebook, new_0, 0}}, - {1905, {wxChoicebook, new_3, 3}}, - {1906, {wxChoicebook, addPage, 3}}, - {1907, {wxChoicebook, advanceSelection, 1}}, - {1908, {wxChoicebook, assignImageList, 1}}, - {1909, {wxChoicebook, create, 3}}, - {1910, {wxChoicebook, deleteAllPages, 0}}, - {1911, {wxChoicebook, deletePage, 1}}, - {1912, {wxChoicebook, removePage, 1}}, - {1913, {wxChoicebook, getCurrentPage, 0}}, - {1914, {wxChoicebook, getImageList, 0}}, - {1916, {wxChoicebook, getPage, 1}}, - {1917, {wxChoicebook, getPageCount, 0}}, - {1918, {wxChoicebook, getPageImage, 1}}, - {1919, {wxChoicebook, getPageText, 1}}, - {1920, {wxChoicebook, getSelection, 0}}, - {1921, {wxChoicebook, hitTest, 2}}, - {1922, {wxChoicebook, insertPage, 4}}, - {1923, {wxChoicebook, setImageList, 1}}, - {1924, {wxChoicebook, setPageSize, 1}}, - {1925, {wxChoicebook, setPageImage, 2}}, - {1926, {wxChoicebook, setPageText, 2}}, - {1927, {wxChoicebook, setSelection, 1}}, - {1928, {wxChoicebook, changeSelection, 1}}, - {1929, {wxChoicebook, 'Destroy', undefined}}, - {1930, {wxToolbook, new_0, 0}}, - {1931, {wxToolbook, new_3, 3}}, - {1932, {wxToolbook, addPage, 3}}, - {1933, {wxToolbook, advanceSelection, 1}}, - {1934, {wxToolbook, assignImageList, 1}}, - {1935, {wxToolbook, create, 3}}, - {1936, {wxToolbook, deleteAllPages, 0}}, - {1937, {wxToolbook, deletePage, 1}}, - {1938, {wxToolbook, removePage, 1}}, - {1939, {wxToolbook, getCurrentPage, 0}}, - {1940, {wxToolbook, getImageList, 0}}, - {1942, {wxToolbook, getPage, 1}}, - {1943, {wxToolbook, getPageCount, 0}}, - {1944, {wxToolbook, getPageImage, 1}}, - {1945, {wxToolbook, getPageText, 1}}, - {1946, {wxToolbook, getSelection, 0}}, - {1948, {wxToolbook, hitTest, 2}}, - {1949, {wxToolbook, insertPage, 4}}, - {1950, {wxToolbook, setImageList, 1}}, - {1951, {wxToolbook, setPageSize, 1}}, - {1952, {wxToolbook, setPageImage, 2}}, - {1953, {wxToolbook, setPageText, 2}}, - {1954, {wxToolbook, setSelection, 1}}, - {1955, {wxToolbook, changeSelection, 1}}, - {1956, {wxToolbook, 'Destroy', undefined}}, - {1957, {wxListbook, new_0, 0}}, - {1958, {wxListbook, new_3, 3}}, - {1959, {wxListbook, addPage, 3}}, - {1960, {wxListbook, advanceSelection, 1}}, - {1961, {wxListbook, assignImageList, 1}}, - {1962, {wxListbook, create, 3}}, - {1963, {wxListbook, deleteAllPages, 0}}, - {1964, {wxListbook, deletePage, 1}}, - {1965, {wxListbook, removePage, 1}}, - {1966, {wxListbook, getCurrentPage, 0}}, - {1967, {wxListbook, getImageList, 0}}, - {1969, {wxListbook, getPage, 1}}, - {1970, {wxListbook, getPageCount, 0}}, - {1971, {wxListbook, getPageImage, 1}}, - {1972, {wxListbook, getPageText, 1}}, - {1973, {wxListbook, getSelection, 0}}, - {1975, {wxListbook, hitTest, 2}}, - {1976, {wxListbook, insertPage, 4}}, - {1977, {wxListbook, setImageList, 1}}, - {1978, {wxListbook, setPageSize, 1}}, - {1979, {wxListbook, setPageImage, 2}}, - {1980, {wxListbook, setPageText, 2}}, - {1981, {wxListbook, setSelection, 1}}, - {1982, {wxListbook, changeSelection, 1}}, - {1983, {wxListbook, 'Destroy', undefined}}, - {1984, {wxTreebook, new_0, 0}}, - {1985, {wxTreebook, new_3, 3}}, - {1986, {wxTreebook, addPage, 3}}, - {1987, {wxTreebook, advanceSelection, 1}}, - {1988, {wxTreebook, assignImageList, 1}}, - {1989, {wxTreebook, create, 3}}, - {1990, {wxTreebook, deleteAllPages, 0}}, - {1991, {wxTreebook, deletePage, 1}}, - {1992, {wxTreebook, removePage, 1}}, - {1993, {wxTreebook, getCurrentPage, 0}}, - {1994, {wxTreebook, getImageList, 0}}, - {1996, {wxTreebook, getPage, 1}}, - {1997, {wxTreebook, getPageCount, 0}}, - {1998, {wxTreebook, getPageImage, 1}}, - {1999, {wxTreebook, getPageText, 1}}, - {2000, {wxTreebook, getSelection, 0}}, - {2001, {wxTreebook, expandNode, 2}}, - {2002, {wxTreebook, isNodeExpanded, 1}}, - {2004, {wxTreebook, hitTest, 2}}, - {2005, {wxTreebook, insertPage, 4}}, - {2006, {wxTreebook, insertSubPage, 4}}, - {2007, {wxTreebook, setImageList, 1}}, - {2008, {wxTreebook, setPageSize, 1}}, - {2009, {wxTreebook, setPageImage, 2}}, - {2010, {wxTreebook, setPageText, 2}}, - {2011, {wxTreebook, setSelection, 1}}, - {2012, {wxTreebook, changeSelection, 1}}, - {2013, {wxTreebook, 'Destroy', undefined}}, - {2016, {wxTreeCtrl, new_2, 2}}, - {2017, {wxTreeCtrl, new_0, 0}}, - {2019, {wxTreeCtrl, destruct, 0}}, - {2020, {wxTreeCtrl, addRoot, 2}}, - {2021, {wxTreeCtrl, appendItem, 3}}, - {2022, {wxTreeCtrl, assignImageList, 1}}, - {2023, {wxTreeCtrl, assignStateImageList, 1}}, - {2024, {wxTreeCtrl, collapse, 1}}, - {2025, {wxTreeCtrl, collapseAndReset, 1}}, - {2026, {wxTreeCtrl, create, 2}}, - {2027, {wxTreeCtrl, delete, 1}}, - {2028, {wxTreeCtrl, deleteAllItems, 0}}, - {2029, {wxTreeCtrl, deleteChildren, 1}}, - {2030, {wxTreeCtrl, editLabel, 1}}, - {2031, {wxTreeCtrl, ensureVisible, 1}}, - {2032, {wxTreeCtrl, expand, 1}}, - {2033, {wxTreeCtrl, getBoundingRect, 3}}, - {2035, {wxTreeCtrl, getChildrenCount, 2}}, - {2036, {wxTreeCtrl, getCount, 0}}, - {2037, {wxTreeCtrl, getEditControl, 0}}, - {2038, {wxTreeCtrl, getFirstChild, 2}}, - {2039, {wxTreeCtrl, getNextChild, 2}}, - {2040, {wxTreeCtrl, getFirstVisibleItem, 0}}, - {2041, {wxTreeCtrl, getImageList, 0}}, - {2042, {wxTreeCtrl, getIndent, 0}}, - {2043, {wxTreeCtrl, getItemBackgroundColour, 1}}, - {2044, {wxTreeCtrl, getItemData, 1}}, - {2045, {wxTreeCtrl, getItemFont, 1}}, - {2046, {wxTreeCtrl, getItemImage_1, 1}}, - {2047, {wxTreeCtrl, getItemImage_2, 2}}, - {2048, {wxTreeCtrl, getItemText, 1}}, - {2049, {wxTreeCtrl, getItemTextColour, 1}}, - {2050, {wxTreeCtrl, getLastChild, 1}}, - {2051, {wxTreeCtrl, getNextSibling, 1}}, - {2052, {wxTreeCtrl, getNextVisible, 1}}, - {2053, {wxTreeCtrl, getItemParent, 1}}, - {2054, {wxTreeCtrl, getPrevSibling, 1}}, - {2055, {wxTreeCtrl, getPrevVisible, 1}}, - {2056, {wxTreeCtrl, getRootItem, 0}}, - {2057, {wxTreeCtrl, getSelection, 0}}, - {2058, {wxTreeCtrl, getSelections, 1}}, - {2059, {wxTreeCtrl, getStateImageList, 0}}, - {2060, {wxTreeCtrl, hitTest, 2}}, - {2062, {wxTreeCtrl, insertItem, 4}}, - {2063, {wxTreeCtrl, isBold, 1}}, - {2064, {wxTreeCtrl, isExpanded, 1}}, - {2065, {wxTreeCtrl, isSelected, 1}}, - {2066, {wxTreeCtrl, isVisible, 1}}, - {2067, {wxTreeCtrl, itemHasChildren, 1}}, - {2068, {wxTreeCtrl, isTreeItemIdOk, 1}}, - {2069, {wxTreeCtrl, prependItem, 3}}, - {2070, {wxTreeCtrl, scrollTo, 1}}, - {2071, {wxTreeCtrl, selectItem_1, 1}}, - {2072, {wxTreeCtrl, selectItem_2, 2}}, - {2073, {wxTreeCtrl, setIndent, 1}}, - {2074, {wxTreeCtrl, setImageList, 1}}, - {2075, {wxTreeCtrl, setItemBackgroundColour, 2}}, - {2076, {wxTreeCtrl, setItemBold, 2}}, - {2077, {wxTreeCtrl, setItemData, 2}}, - {2078, {wxTreeCtrl, setItemDropHighlight, 2}}, - {2079, {wxTreeCtrl, setItemFont, 2}}, - {2080, {wxTreeCtrl, setItemHasChildren, 2}}, - {2081, {wxTreeCtrl, setItemImage_2, 2}}, - {2082, {wxTreeCtrl, setItemImage_3, 3}}, - {2083, {wxTreeCtrl, setItemText, 2}}, - {2084, {wxTreeCtrl, setItemTextColour, 2}}, - {2085, {wxTreeCtrl, setStateImageList, 1}}, - {2086, {wxTreeCtrl, setWindowStyle, 1}}, - {2087, {wxTreeCtrl, sortChildren, 1}}, - {2088, {wxTreeCtrl, toggle, 1}}, - {2089, {wxTreeCtrl, toggleItemSelection, 1}}, - {2090, {wxTreeCtrl, unselect, 0}}, - {2091, {wxTreeCtrl, unselectAll, 0}}, - {2092, {wxTreeCtrl, unselectItem, 1}}, - {2093, {wxScrollBar, new_0, 0}}, - {2094, {wxScrollBar, new_3, 3}}, - {2095, {wxScrollBar, destruct, 0}}, - {2096, {wxScrollBar, create, 3}}, - {2097, {wxScrollBar, getRange, 0}}, - {2098, {wxScrollBar, getPageSize, 0}}, - {2099, {wxScrollBar, getThumbPosition, 0}}, - {2100, {wxScrollBar, getThumbSize, 0}}, - {2101, {wxScrollBar, setThumbPosition, 1}}, - {2102, {wxScrollBar, setScrollbar, 5}}, - {2104, {wxSpinButton, new_2, 2}}, - {2105, {wxSpinButton, new_0, 0}}, - {2106, {wxSpinButton, create, 2}}, - {2107, {wxSpinButton, getMax, 0}}, - {2108, {wxSpinButton, getMin, 0}}, - {2109, {wxSpinButton, getValue, 0}}, - {2110, {wxSpinButton, setRange, 2}}, - {2111, {wxSpinButton, setValue, 1}}, - {2112, {wxSpinButton, 'Destroy', undefined}}, - {2113, {wxSpinCtrl, new_0, 0}}, - {2114, {wxSpinCtrl, new_2, 2}}, - {2116, {wxSpinCtrl, create, 2}}, - {2119, {wxSpinCtrl, setValue_1_1, 1}}, - {2120, {wxSpinCtrl, setValue_1_0, 1}}, - {2122, {wxSpinCtrl, getValue, 0}}, - {2124, {wxSpinCtrl, setRange, 2}}, - {2125, {wxSpinCtrl, setSelection, 2}}, - {2127, {wxSpinCtrl, getMin, 0}}, - {2129, {wxSpinCtrl, getMax, 0}}, - {2130, {wxSpinCtrl, 'Destroy', undefined}}, - {2131, {wxStaticText, new_0, 0}}, - {2132, {wxStaticText, new_4, 4}}, - {2133, {wxStaticText, create, 4}}, - {2134, {wxStaticText, getLabel, 0}}, - {2135, {wxStaticText, setLabel, 1}}, - {2136, {wxStaticText, wrap, 1}}, - {2137, {wxStaticText, 'Destroy', undefined}}, - {2138, {wxStaticBitmap, new_0, 0}}, - {2139, {wxStaticBitmap, new_4, 4}}, - {2140, {wxStaticBitmap, create, 4}}, - {2141, {wxStaticBitmap, getBitmap, 0}}, - {2142, {wxStaticBitmap, setBitmap, 1}}, - {2143, {wxStaticBitmap, 'Destroy', undefined}}, - {2144, {wxRadioBox, new, 7}}, - {2146, {wxRadioBox, destruct, 0}}, - {2147, {wxRadioBox, create, 7}}, - {2148, {wxRadioBox, enable_2, 2}}, - {2149, {wxRadioBox, enable_1, 1}}, - {2150, {wxRadioBox, getSelection, 0}}, - {2151, {wxRadioBox, getString, 1}}, - {2152, {wxRadioBox, setSelection, 1}}, - {2153, {wxRadioBox, show_2, 2}}, - {2154, {wxRadioBox, show_1, 1}}, - {2155, {wxRadioBox, getColumnCount, 0}}, - {2156, {wxRadioBox, getItemHelpText, 1}}, - {2157, {wxRadioBox, getItemToolTip, 1}}, - {2159, {wxRadioBox, getItemFromPoint, 1}}, - {2160, {wxRadioBox, getRowCount, 0}}, - {2161, {wxRadioBox, isItemEnabled, 1}}, - {2162, {wxRadioBox, isItemShown, 1}}, - {2163, {wxRadioBox, setItemHelpText, 2}}, - {2164, {wxRadioBox, setItemToolTip, 2}}, - {2165, {wxRadioButton, new_0, 0}}, - {2166, {wxRadioButton, new_4, 4}}, - {2167, {wxRadioButton, create, 4}}, - {2168, {wxRadioButton, getValue, 0}}, - {2169, {wxRadioButton, setValue, 1}}, - {2170, {wxRadioButton, 'Destroy', undefined}}, - {2172, {wxSlider, new_6, 6}}, - {2173, {wxSlider, new_0, 0}}, - {2174, {wxSlider, create, 6}}, - {2175, {wxSlider, getLineSize, 0}}, - {2176, {wxSlider, getMax, 0}}, - {2177, {wxSlider, getMin, 0}}, - {2178, {wxSlider, getPageSize, 0}}, - {2179, {wxSlider, getThumbLength, 0}}, - {2180, {wxSlider, getValue, 0}}, - {2181, {wxSlider, setLineSize, 1}}, - {2182, {wxSlider, setPageSize, 1}}, - {2183, {wxSlider, setRange, 2}}, - {2184, {wxSlider, setThumbLength, 1}}, - {2185, {wxSlider, setValue, 1}}, - {2186, {wxSlider, 'Destroy', undefined}}, - {2188, {wxDialog, new_4, 4}}, - {2189, {wxDialog, new_0, 0}}, - {2191, {wxDialog, destruct, 0}}, - {2192, {wxDialog, create, 4}}, - {2193, {wxDialog, createButtonSizer, 1}}, - {2194, {wxDialog, createStdDialogButtonSizer, 1}}, - {2195, {wxDialog, endModal, 1}}, - {2196, {wxDialog, getAffirmativeId, 0}}, - {2197, {wxDialog, getReturnCode, 0}}, - {2198, {wxDialog, isModal, 0}}, - {2199, {wxDialog, setAffirmativeId, 1}}, - {2200, {wxDialog, setReturnCode, 1}}, - {2201, {wxDialog, show, 1}}, - {2202, {wxDialog, showModal, 0}}, - {2203, {wxColourDialog, new_0, 0}}, - {2204, {wxColourDialog, new_2, 2}}, - {2205, {wxColourDialog, destruct, 0}}, - {2206, {wxColourDialog, create, 2}}, - {2207, {wxColourDialog, getColourData, 0}}, - {2208, {wxColourData, new_0, 0}}, - {2209, {wxColourData, new_1, 1}}, - {2210, {wxColourData, destruct, 0}}, - {2211, {wxColourData, getChooseFull, 0}}, - {2212, {wxColourData, getColour, 0}}, - {2214, {wxColourData, getCustomColour, 1}}, - {2215, {wxColourData, setChooseFull, 1}}, - {2216, {wxColourData, setColour, 1}}, - {2217, {wxColourData, setCustomColour, 2}}, - {2218, {wxPalette, new_0, 0}}, - {2219, {wxPalette, new_4, 4}}, - {2221, {wxPalette, destruct, 0}}, - {2222, {wxPalette, create, 4}}, - {2223, {wxPalette, getColoursCount, 0}}, - {2224, {wxPalette, getPixel, 3}}, - {2225, {wxPalette, getRGB, 4}}, - {2226, {wxPalette, isOk, 0}}, - {2230, {wxDirDialog, new, 2}}, - {2231, {wxDirDialog, destruct, 0}}, - {2232, {wxDirDialog, getPath, 0}}, - {2233, {wxDirDialog, getMessage, 0}}, - {2234, {wxDirDialog, setMessage, 1}}, - {2235, {wxDirDialog, setPath, 1}}, - {2239, {wxFileDialog, new, 2}}, - {2240, {wxFileDialog, destruct, 0}}, - {2241, {wxFileDialog, getDirectory, 0}}, - {2242, {wxFileDialog, getFilename, 0}}, - {2243, {wxFileDialog, getFilenames, 1}}, - {2244, {wxFileDialog, getFilterIndex, 0}}, - {2245, {wxFileDialog, getMessage, 0}}, - {2246, {wxFileDialog, getPath, 0}}, - {2247, {wxFileDialog, getPaths, 1}}, - {2248, {wxFileDialog, getWildcard, 0}}, - {2249, {wxFileDialog, setDirectory, 1}}, - {2250, {wxFileDialog, setFilename, 1}}, - {2251, {wxFileDialog, setFilterIndex, 1}}, - {2252, {wxFileDialog, setMessage, 1}}, - {2253, {wxFileDialog, setPath, 1}}, - {2254, {wxFileDialog, setWildcard, 1}}, - {2255, {wxPickerBase, setInternalMargin, 1}}, - {2256, {wxPickerBase, getInternalMargin, 0}}, - {2257, {wxPickerBase, setTextCtrlProportion, 1}}, - {2258, {wxPickerBase, setPickerCtrlProportion, 1}}, - {2259, {wxPickerBase, getTextCtrlProportion, 0}}, - {2260, {wxPickerBase, getPickerCtrlProportion, 0}}, - {2261, {wxPickerBase, hasTextCtrl, 0}}, - {2262, {wxPickerBase, getTextCtrl, 0}}, - {2263, {wxPickerBase, isTextCtrlGrowable, 0}}, - {2264, {wxPickerBase, setPickerCtrlGrowable, 1}}, - {2265, {wxPickerBase, setTextCtrlGrowable, 1}}, - {2266, {wxPickerBase, isPickerCtrlGrowable, 0}}, - {2267, {wxFilePickerCtrl, new_0, 0}}, - {2268, {wxFilePickerCtrl, new_3, 3}}, - {2269, {wxFilePickerCtrl, create, 3}}, - {2270, {wxFilePickerCtrl, getPath, 0}}, - {2271, {wxFilePickerCtrl, setPath, 1}}, - {2272, {wxFilePickerCtrl, 'Destroy', undefined}}, - {2273, {wxDirPickerCtrl, new_0, 0}}, - {2274, {wxDirPickerCtrl, new_3, 3}}, - {2275, {wxDirPickerCtrl, create, 3}}, - {2276, {wxDirPickerCtrl, getPath, 0}}, - {2277, {wxDirPickerCtrl, setPath, 1}}, - {2278, {wxDirPickerCtrl, 'Destroy', undefined}}, - {2279, {wxColourPickerCtrl, new_0, 0}}, - {2280, {wxColourPickerCtrl, new_3, 3}}, - {2281, {wxColourPickerCtrl, create, 3}}, - {2282, {wxColourPickerCtrl, getColour, 0}}, - {2283, {wxColourPickerCtrl, setColour_1_1, 1}}, - {2284, {wxColourPickerCtrl, setColour_1_0, 1}}, - {2285, {wxColourPickerCtrl, 'Destroy', undefined}}, - {2286, {wxDatePickerCtrl, new_0, 0}}, - {2287, {wxDatePickerCtrl, new_3, 3}}, - {2288, {wxDatePickerCtrl, getRange, 2}}, - {2289, {wxDatePickerCtrl, getValue, 0}}, - {2290, {wxDatePickerCtrl, setRange, 2}}, - {2291, {wxDatePickerCtrl, setValue, 1}}, - {2292, {wxDatePickerCtrl, 'Destroy', undefined}}, - {2293, {wxFontPickerCtrl, new_0, 0}}, - {2294, {wxFontPickerCtrl, new_3, 3}}, - {2295, {wxFontPickerCtrl, create, 3}}, - {2296, {wxFontPickerCtrl, getSelectedFont, 0}}, - {2297, {wxFontPickerCtrl, setSelectedFont, 1}}, - {2298, {wxFontPickerCtrl, getMaxPointSize, 0}}, - {2299, {wxFontPickerCtrl, setMaxPointSize, 1}}, - {2300, {wxFontPickerCtrl, 'Destroy', undefined}}, - {2303, {wxFindReplaceDialog, new_0, 0}}, - {2304, {wxFindReplaceDialog, new_4, 4}}, - {2305, {wxFindReplaceDialog, destruct, 0}}, - {2306, {wxFindReplaceDialog, create, 4}}, - {2307, {wxFindReplaceDialog, getData, 0}}, - {2308, {wxFindReplaceData, new_0, 0}}, - {2309, {wxFindReplaceData, new_1, 1}}, - {2310, {wxFindReplaceData, getFindString, 0}}, - {2311, {wxFindReplaceData, getReplaceString, 0}}, - {2312, {wxFindReplaceData, getFlags, 0}}, - {2313, {wxFindReplaceData, setFlags, 1}}, - {2314, {wxFindReplaceData, setFindString, 1}}, - {2315, {wxFindReplaceData, setReplaceString, 1}}, - {2316, {wxFindReplaceData, 'Destroy', undefined}}, - {2317, {wxMultiChoiceDialog, new_0, 0}}, - {2319, {wxMultiChoiceDialog, new_5, 5}}, - {2320, {wxMultiChoiceDialog, getSelections, 0}}, - {2321, {wxMultiChoiceDialog, setSelections, 1}}, - {2322, {wxMultiChoiceDialog, 'Destroy', undefined}}, - {2323, {wxSingleChoiceDialog, new_0, 0}}, - {2325, {wxSingleChoiceDialog, new_5, 5}}, - {2326, {wxSingleChoiceDialog, getSelection, 0}}, - {2327, {wxSingleChoiceDialog, getStringSelection, 0}}, - {2328, {wxSingleChoiceDialog, setSelection, 1}}, - {2329, {wxSingleChoiceDialog, 'Destroy', undefined}}, - {2330, {wxTextEntryDialog, new, 3}}, - {2331, {wxTextEntryDialog, getValue, 0}}, - {2332, {wxTextEntryDialog, setValue, 1}}, - {2333, {wxTextEntryDialog, 'Destroy', undefined}}, - {2334, {wxPasswordEntryDialog, new, 3}}, - {2335, {wxPasswordEntryDialog, 'Destroy', undefined}}, - {2336, {wxFontData, new_0, 0}}, - {2337, {wxFontData, new_1, 1}}, - {2338, {wxFontData, destruct, 0}}, - {2339, {wxFontData, enableEffects, 1}}, - {2340, {wxFontData, getAllowSymbols, 0}}, - {2341, {wxFontData, getColour, 0}}, - {2342, {wxFontData, getChosenFont, 0}}, - {2343, {wxFontData, getEnableEffects, 0}}, - {2344, {wxFontData, getInitialFont, 0}}, - {2345, {wxFontData, getShowHelp, 0}}, - {2346, {wxFontData, setAllowSymbols, 1}}, - {2347, {wxFontData, setChosenFont, 1}}, - {2348, {wxFontData, setColour, 1}}, - {2349, {wxFontData, setInitialFont, 1}}, - {2350, {wxFontData, setRange, 2}}, - {2351, {wxFontData, setShowHelp, 1}}, - {2355, {wxFontDialog, new_0, 0}}, - {2357, {wxFontDialog, new_2, 2}}, - {2359, {wxFontDialog, create, 2}}, - {2360, {wxFontDialog, getFontData, 0}}, - {2362, {wxFontDialog, 'Destroy', undefined}}, - {2363, {wxProgressDialog, new, 3}}, - {2364, {wxProgressDialog, destruct, 0}}, - {2365, {wxProgressDialog, resume, 0}}, - {2366, {wxProgressDialog, update_2, 2}}, - {2367, {wxProgressDialog, update_0, 0}}, - {2368, {wxMessageDialog, new, 3}}, - {2369, {wxMessageDialog, destruct, 0}}, - {2370, {wxPageSetupDialog, new, 2}}, - {2371, {wxPageSetupDialog, destruct, 0}}, - {2372, {wxPageSetupDialog, getPageSetupData, 0}}, - {2373, {wxPageSetupDialog, showModal, 0}}, - {2374, {wxPageSetupDialogData, new_0, 0}}, - {2375, {wxPageSetupDialogData, new_1_0, 1}}, - {2376, {wxPageSetupDialogData, new_1_1, 1}}, - {2377, {wxPageSetupDialogData, destruct, 0}}, - {2378, {wxPageSetupDialogData, enableHelp, 1}}, - {2379, {wxPageSetupDialogData, enableMargins, 1}}, - {2380, {wxPageSetupDialogData, enableOrientation, 1}}, - {2381, {wxPageSetupDialogData, enablePaper, 1}}, - {2382, {wxPageSetupDialogData, enablePrinter, 1}}, - {2383, {wxPageSetupDialogData, getDefaultMinMargins, 0}}, - {2384, {wxPageSetupDialogData, getEnableMargins, 0}}, - {2385, {wxPageSetupDialogData, getEnableOrientation, 0}}, - {2386, {wxPageSetupDialogData, getEnablePaper, 0}}, - {2387, {wxPageSetupDialogData, getEnablePrinter, 0}}, - {2388, {wxPageSetupDialogData, getEnableHelp, 0}}, - {2389, {wxPageSetupDialogData, getDefaultInfo, 0}}, - {2390, {wxPageSetupDialogData, getMarginTopLeft, 0}}, - {2391, {wxPageSetupDialogData, getMarginBottomRight, 0}}, - {2392, {wxPageSetupDialogData, getMinMarginTopLeft, 0}}, - {2393, {wxPageSetupDialogData, getMinMarginBottomRight, 0}}, - {2394, {wxPageSetupDialogData, getPaperId, 0}}, - {2395, {wxPageSetupDialogData, getPaperSize, 0}}, - {2397, {wxPageSetupDialogData, getPrintData, 0}}, - {2398, {wxPageSetupDialogData, isOk, 0}}, - {2399, {wxPageSetupDialogData, setDefaultInfo, 1}}, - {2400, {wxPageSetupDialogData, setDefaultMinMargins, 1}}, - {2401, {wxPageSetupDialogData, setMarginTopLeft, 1}}, - {2402, {wxPageSetupDialogData, setMarginBottomRight, 1}}, - {2403, {wxPageSetupDialogData, setMinMarginTopLeft, 1}}, - {2404, {wxPageSetupDialogData, setMinMarginBottomRight, 1}}, - {2405, {wxPageSetupDialogData, setPaperId, 1}}, - {2406, {wxPageSetupDialogData, setPaperSize_1_1, 1}}, - {2407, {wxPageSetupDialogData, setPaperSize_1_0, 1}}, - {2408, {wxPageSetupDialogData, setPrintData, 1}}, - {2409, {wxPrintDialog, new_2_0, 2}}, - {2410, {wxPrintDialog, new_2_1, 2}}, - {2411, {wxPrintDialog, destruct, 0}}, - {2412, {wxPrintDialog, getPrintDialogData, 0}}, - {2413, {wxPrintDialog, getPrintDC, 0}}, - {2414, {wxPrintDialogData, new_0, 0}}, - {2415, {wxPrintDialogData, new_1_1, 1}}, - {2416, {wxPrintDialogData, new_1_0, 1}}, - {2417, {wxPrintDialogData, destruct, 0}}, - {2418, {wxPrintDialogData, enableHelp, 1}}, - {2419, {wxPrintDialogData, enablePageNumbers, 1}}, - {2420, {wxPrintDialogData, enablePrintToFile, 1}}, - {2421, {wxPrintDialogData, enableSelection, 1}}, - {2422, {wxPrintDialogData, getAllPages, 0}}, - {2423, {wxPrintDialogData, getCollate, 0}}, - {2424, {wxPrintDialogData, getFromPage, 0}}, - {2425, {wxPrintDialogData, getMaxPage, 0}}, - {2426, {wxPrintDialogData, getMinPage, 0}}, - {2427, {wxPrintDialogData, getNoCopies, 0}}, - {2428, {wxPrintDialogData, getPrintData, 0}}, - {2429, {wxPrintDialogData, getPrintToFile, 0}}, - {2430, {wxPrintDialogData, getSelection, 0}}, - {2431, {wxPrintDialogData, getToPage, 0}}, - {2432, {wxPrintDialogData, isOk, 0}}, - {2433, {wxPrintDialogData, setCollate, 1}}, - {2434, {wxPrintDialogData, setFromPage, 1}}, - {2435, {wxPrintDialogData, setMaxPage, 1}}, - {2436, {wxPrintDialogData, setMinPage, 1}}, - {2437, {wxPrintDialogData, setNoCopies, 1}}, - {2438, {wxPrintDialogData, setPrintData, 1}}, - {2439, {wxPrintDialogData, setPrintToFile, 1}}, - {2440, {wxPrintDialogData, setSelection, 1}}, - {2441, {wxPrintDialogData, setToPage, 1}}, - {2442, {wxPrintData, new_0, 0}}, - {2443, {wxPrintData, new_1, 1}}, - {2444, {wxPrintData, destruct, 0}}, - {2445, {wxPrintData, getCollate, 0}}, - {2446, {wxPrintData, getBin, 0}}, - {2447, {wxPrintData, getColour, 0}}, - {2448, {wxPrintData, getDuplex, 0}}, - {2449, {wxPrintData, getNoCopies, 0}}, - {2450, {wxPrintData, getOrientation, 0}}, - {2451, {wxPrintData, getPaperId, 0}}, - {2452, {wxPrintData, getPrinterName, 0}}, - {2453, {wxPrintData, getQuality, 0}}, - {2454, {wxPrintData, isOk, 0}}, - {2455, {wxPrintData, setBin, 1}}, - {2456, {wxPrintData, setCollate, 1}}, - {2457, {wxPrintData, setColour, 1}}, - {2458, {wxPrintData, setDuplex, 1}}, - {2459, {wxPrintData, setNoCopies, 1}}, - {2460, {wxPrintData, setOrientation, 1}}, - {2461, {wxPrintData, setPaperId, 1}}, - {2462, {wxPrintData, setPrinterName, 1}}, - {2463, {wxPrintData, setQuality, 1}}, - {2466, {wxPrintPreview, new_2, 2}}, - {2467, {wxPrintPreview, new_3, 3}}, - {2469, {wxPrintPreview, destruct, 0}}, - {2470, {wxPrintPreview, getCanvas, 0}}, - {2471, {wxPrintPreview, getCurrentPage, 0}}, - {2472, {wxPrintPreview, getFrame, 0}}, - {2473, {wxPrintPreview, getMaxPage, 0}}, - {2474, {wxPrintPreview, getMinPage, 0}}, - {2475, {wxPrintPreview, getPrintout, 0}}, - {2476, {wxPrintPreview, getPrintoutForPrinting, 0}}, - {2477, {wxPrintPreview, isOk, 0}}, - {2478, {wxPrintPreview, paintPage, 2}}, - {2479, {wxPrintPreview, print, 1}}, - {2480, {wxPrintPreview, renderPage, 1}}, - {2481, {wxPrintPreview, setCanvas, 1}}, - {2482, {wxPrintPreview, setCurrentPage, 1}}, - {2483, {wxPrintPreview, setFrame, 1}}, - {2484, {wxPrintPreview, setPrintout, 1}}, - {2485, {wxPrintPreview, setZoom, 1}}, - {2486, {wxPreviewFrame, new, 3}}, - {2487, {wxPreviewFrame, destruct, 0}}, - {2488, {wxPreviewFrame, createControlBar, 0}}, - {2489, {wxPreviewFrame, createCanvas, 0}}, - {2490, {wxPreviewFrame, initialize, 0}}, - {2491, {wxPreviewFrame, onCloseWindow, 1}}, - {2492, {wxPreviewControlBar, new, 4}}, - {2493, {wxPreviewControlBar, destruct, 0}}, - {2494, {wxPreviewControlBar, createButtons, 0}}, - {2495, {wxPreviewControlBar, getPrintPreview, 0}}, - {2496, {wxPreviewControlBar, getZoomControl, 0}}, - {2497, {wxPreviewControlBar, setZoomControl, 1}}, - {2499, {wxPrinter, new, 1}}, - {2500, {wxPrinter, createAbortWindow, 2}}, - {2501, {wxPrinter, getAbort, 0}}, - {2502, {wxPrinter, getLastError, 0}}, - {2503, {wxPrinter, getPrintDialogData, 0}}, - {2504, {wxPrinter, print, 3}}, - {2505, {wxPrinter, printDialog, 1}}, - {2506, {wxPrinter, reportError, 3}}, - {2507, {wxPrinter, setup, 1}}, - {2508, {wxPrinter, 'Destroy', undefined}}, - {2509, {wxXmlResource, new_1, 1}}, - {2510, {wxXmlResource, new_2, 2}}, - {2511, {wxXmlResource, destruct, 0}}, - {2512, {wxXmlResource, attachUnknownControl, 3}}, - {2513, {wxXmlResource, clearHandlers, 0}}, - {2514, {wxXmlResource, compareVersion, 4}}, - {2515, {wxXmlResource, get, 0}}, - {2516, {wxXmlResource, getFlags, 0}}, - {2517, {wxXmlResource, getVersion, 0}}, - {2518, {wxXmlResource, getXRCID, 2}}, - {2519, {wxXmlResource, initAllHandlers, 0}}, - {2520, {wxXmlResource, load, 1}}, - {2521, {wxXmlResource, loadBitmap, 1}}, - {2522, {wxXmlResource, loadDialog_2, 2}}, - {2523, {wxXmlResource, loadDialog_3, 3}}, - {2524, {wxXmlResource, loadFrame_2, 2}}, - {2525, {wxXmlResource, loadFrame_3, 3}}, - {2526, {wxXmlResource, loadIcon, 1}}, - {2527, {wxXmlResource, loadMenu, 1}}, - {2528, {wxXmlResource, loadMenuBar_2, 2}}, - {2529, {wxXmlResource, loadMenuBar_1, 1}}, - {2530, {wxXmlResource, loadPanel_2, 2}}, - {2531, {wxXmlResource, loadPanel_3, 3}}, - {2532, {wxXmlResource, loadToolBar, 2}}, - {2533, {wxXmlResource, set, 1}}, - {2534, {wxXmlResource, setFlags, 1}}, - {2535, {wxXmlResource, unload, 1}}, - {2536, {wxXmlResource, xrcctrl, 3}}, - {2537, {wxHtmlEasyPrinting, new, 1}}, - {2538, {wxHtmlEasyPrinting, destruct, 0}}, - {2539, {wxHtmlEasyPrinting, getPrintData, 0}}, - {2540, {wxHtmlEasyPrinting, getPageSetupData, 0}}, - {2541, {wxHtmlEasyPrinting, previewFile, 1}}, - {2542, {wxHtmlEasyPrinting, previewText, 2}}, - {2543, {wxHtmlEasyPrinting, printFile, 1}}, - {2544, {wxHtmlEasyPrinting, printText, 2}}, - {2545, {wxHtmlEasyPrinting, pageSetup, 0}}, - {2546, {wxHtmlEasyPrinting, setFonts, 3}}, - {2547, {wxHtmlEasyPrinting, setHeader, 2}}, - {2548, {wxHtmlEasyPrinting, setFooter, 2}}, - {2550, {wxGLCanvas, new_2, 2}}, - {2551, {wxGLCanvas, new_3_1, 3}}, - {2552, {wxGLCanvas, new_3_0, 3}}, - {2553, {wxGLCanvas, getContext, 0}}, - {2555, {wxGLCanvas, setCurrent, 0}}, - {2556, {wxGLCanvas, swapBuffers, 0}}, - {2557, {wxGLCanvas, 'Destroy', undefined}}, - {2558, {wxAuiManager, new, 1}}, - {2559, {wxAuiManager, destruct, 0}}, - {2560, {wxAuiManager, addPane_2_1, 2}}, - {2561, {wxAuiManager, addPane_3, 3}}, - {2562, {wxAuiManager, addPane_2_0, 2}}, - {2563, {wxAuiManager, detachPane, 1}}, - {2564, {wxAuiManager, getAllPanes, 0}}, - {2565, {wxAuiManager, getArtProvider, 0}}, - {2566, {wxAuiManager, getDockSizeConstraint, 2}}, - {2567, {wxAuiManager, getFlags, 0}}, - {2568, {wxAuiManager, getManagedWindow, 0}}, - {2569, {wxAuiManager, getManager, 1}}, - {2570, {wxAuiManager, getPane_1_1, 1}}, - {2571, {wxAuiManager, getPane_1_0, 1}}, - {2572, {wxAuiManager, hideHint, 0}}, - {2573, {wxAuiManager, insertPane, 3}}, - {2574, {wxAuiManager, loadPaneInfo, 2}}, - {2575, {wxAuiManager, loadPerspective, 2}}, - {2576, {wxAuiManager, savePaneInfo, 1}}, - {2577, {wxAuiManager, savePerspective, 0}}, - {2578, {wxAuiManager, setArtProvider, 1}}, - {2579, {wxAuiManager, setDockSizeConstraint, 2}}, - {2580, {wxAuiManager, setFlags, 1}}, - {2581, {wxAuiManager, setManagedWindow, 1}}, - {2582, {wxAuiManager, showHint, 1}}, - {2583, {wxAuiManager, unInit, 0}}, - {2584, {wxAuiManager, update, 0}}, - {2585, {wxAuiPaneInfo, new_0, 0}}, - {2586, {wxAuiPaneInfo, new_1, 1}}, - {2587, {wxAuiPaneInfo, destruct, 0}}, - {2588, {wxAuiPaneInfo, bestSize_1, 1}}, - {2589, {wxAuiPaneInfo, bestSize_2, 2}}, - {2590, {wxAuiPaneInfo, bottom, 0}}, - {2591, {wxAuiPaneInfo, bottomDockable, 1}}, - {2592, {wxAuiPaneInfo, caption, 1}}, - {2593, {wxAuiPaneInfo, captionVisible, 1}}, - {2594, {wxAuiPaneInfo, centre, 0}}, - {2595, {wxAuiPaneInfo, centrePane, 0}}, - {2596, {wxAuiPaneInfo, closeButton, 1}}, - {2597, {wxAuiPaneInfo, defaultPane, 0}}, - {2598, {wxAuiPaneInfo, destroyOnClose, 1}}, - {2599, {wxAuiPaneInfo, direction, 1}}, - {2600, {wxAuiPaneInfo, dock, 0}}, - {2601, {wxAuiPaneInfo, dockable, 1}}, - {2602, {wxAuiPaneInfo, fixed, 0}}, - {2603, {wxAuiPaneInfo, float, 0}}, - {2604, {wxAuiPaneInfo, floatable, 1}}, - {2605, {wxAuiPaneInfo, floatingPosition_1, 1}}, - {2606, {wxAuiPaneInfo, floatingPosition_2, 2}}, - {2607, {wxAuiPaneInfo, floatingSize_1, 1}}, - {2608, {wxAuiPaneInfo, floatingSize_2, 2}}, - {2609, {wxAuiPaneInfo, gripper, 1}}, - {2610, {wxAuiPaneInfo, gripperTop, 1}}, - {2611, {wxAuiPaneInfo, hasBorder, 0}}, - {2612, {wxAuiPaneInfo, hasCaption, 0}}, - {2613, {wxAuiPaneInfo, hasCloseButton, 0}}, - {2614, {wxAuiPaneInfo, hasFlag, 1}}, - {2615, {wxAuiPaneInfo, hasGripper, 0}}, - {2616, {wxAuiPaneInfo, hasGripperTop, 0}}, - {2617, {wxAuiPaneInfo, hasMaximizeButton, 0}}, - {2618, {wxAuiPaneInfo, hasMinimizeButton, 0}}, - {2619, {wxAuiPaneInfo, hasPinButton, 0}}, - {2620, {wxAuiPaneInfo, hide, 0}}, - {2621, {wxAuiPaneInfo, isBottomDockable, 0}}, - {2622, {wxAuiPaneInfo, isDocked, 0}}, - {2623, {wxAuiPaneInfo, isFixed, 0}}, - {2624, {wxAuiPaneInfo, isFloatable, 0}}, - {2625, {wxAuiPaneInfo, isFloating, 0}}, - {2626, {wxAuiPaneInfo, isLeftDockable, 0}}, - {2627, {wxAuiPaneInfo, isMovable, 0}}, - {2628, {wxAuiPaneInfo, isOk, 0}}, - {2629, {wxAuiPaneInfo, isResizable, 0}}, - {2630, {wxAuiPaneInfo, isRightDockable, 0}}, - {2631, {wxAuiPaneInfo, isShown, 0}}, - {2632, {wxAuiPaneInfo, isToolbar, 0}}, - {2633, {wxAuiPaneInfo, isTopDockable, 0}}, - {2634, {wxAuiPaneInfo, layer, 1}}, - {2635, {wxAuiPaneInfo, left, 0}}, - {2636, {wxAuiPaneInfo, leftDockable, 1}}, - {2637, {wxAuiPaneInfo, maxSize_1, 1}}, - {2638, {wxAuiPaneInfo, maxSize_2, 2}}, - {2639, {wxAuiPaneInfo, maximizeButton, 1}}, - {2640, {wxAuiPaneInfo, minSize_1, 1}}, - {2641, {wxAuiPaneInfo, minSize_2, 2}}, - {2642, {wxAuiPaneInfo, minimizeButton, 1}}, - {2643, {wxAuiPaneInfo, movable, 1}}, - {2644, {wxAuiPaneInfo, name, 1}}, - {2645, {wxAuiPaneInfo, paneBorder, 1}}, - {2646, {wxAuiPaneInfo, pinButton, 1}}, - {2647, {wxAuiPaneInfo, position, 1}}, - {2648, {wxAuiPaneInfo, resizable, 1}}, - {2649, {wxAuiPaneInfo, right, 0}}, - {2650, {wxAuiPaneInfo, rightDockable, 1}}, - {2651, {wxAuiPaneInfo, row, 1}}, - {2652, {wxAuiPaneInfo, safeSet, 1}}, - {2653, {wxAuiPaneInfo, setFlag, 2}}, - {2654, {wxAuiPaneInfo, show, 1}}, - {2655, {wxAuiPaneInfo, toolbarPane, 0}}, - {2656, {wxAuiPaneInfo, top, 0}}, - {2657, {wxAuiPaneInfo, topDockable, 1}}, - {2658, {wxAuiPaneInfo, window, 1}}, - {2659, {wxAuiPaneInfo, getWindow, 0}}, - {2660, {wxAuiPaneInfo, getFrame, 0}}, - {2661, {wxAuiPaneInfo, getDirection, 0}}, - {2662, {wxAuiPaneInfo, getLayer, 0}}, - {2663, {wxAuiPaneInfo, getRow, 0}}, - {2664, {wxAuiPaneInfo, getPosition, 0}}, - {2665, {wxAuiPaneInfo, getFloatingPosition, 0}}, - {2666, {wxAuiPaneInfo, getFloatingSize, 0}}, - {2667, {wxAuiNotebook, new_0, 0}}, - {2668, {wxAuiNotebook, new_2, 2}}, - {2669, {wxAuiNotebook, addPage, 3}}, - {2670, {wxAuiNotebook, create, 2}}, - {2671, {wxAuiNotebook, deletePage, 1}}, - {2672, {wxAuiNotebook, getArtProvider, 0}}, - {2673, {wxAuiNotebook, getPage, 1}}, - {2674, {wxAuiNotebook, getPageBitmap, 1}}, - {2675, {wxAuiNotebook, getPageCount, 0}}, - {2676, {wxAuiNotebook, getPageIndex, 1}}, - {2677, {wxAuiNotebook, getPageText, 1}}, - {2678, {wxAuiNotebook, getSelection, 0}}, - {2679, {wxAuiNotebook, insertPage, 4}}, - {2680, {wxAuiNotebook, removePage, 1}}, - {2681, {wxAuiNotebook, setArtProvider, 1}}, - {2682, {wxAuiNotebook, setFont, 1}}, - {2683, {wxAuiNotebook, setPageBitmap, 2}}, - {2684, {wxAuiNotebook, setPageText, 2}}, - {2685, {wxAuiNotebook, setSelection, 1}}, - {2686, {wxAuiNotebook, setTabCtrlHeight, 1}}, - {2687, {wxAuiNotebook, setUniformBitmapSize, 1}}, - {2688, {wxAuiNotebook, 'Destroy', undefined}}, - {2689, {wxAuiTabArt, setFlags, 1}}, - {2690, {wxAuiTabArt, setMeasuringFont, 1}}, - {2691, {wxAuiTabArt, setNormalFont, 1}}, - {2692, {wxAuiTabArt, setSelectedFont, 1}}, - {2693, {wxAuiTabArt, setColour, 1}}, - {2694, {wxAuiTabArt, setActiveColour, 1}}, - {2695, {wxAuiDockArt, getColour, 1}}, - {2696, {wxAuiDockArt, getFont, 1}}, - {2697, {wxAuiDockArt, getMetric, 1}}, - {2698, {wxAuiDockArt, setColour, 2}}, - {2699, {wxAuiDockArt, setFont, 2}}, - {2700, {wxAuiDockArt, setMetric, 2}}, - {2701, {wxAuiSimpleTabArt, new, 0}}, - {2702, {wxAuiSimpleTabArt, 'Destroy', undefined}}, - {2703, {wxMDIParentFrame, new_0, 0}}, - {2704, {wxMDIParentFrame, new_4, 4}}, - {2705, {wxMDIParentFrame, destruct, 0}}, - {2706, {wxMDIParentFrame, activateNext, 0}}, - {2707, {wxMDIParentFrame, activatePrevious, 0}}, - {2708, {wxMDIParentFrame, arrangeIcons, 0}}, - {2709, {wxMDIParentFrame, cascade, 0}}, - {2710, {wxMDIParentFrame, create, 4}}, - {2711, {wxMDIParentFrame, getActiveChild, 0}}, - {2712, {wxMDIParentFrame, getClientWindow, 0}}, - {2713, {wxMDIParentFrame, tile, 1}}, - {2714, {wxMDIChildFrame, new_0, 0}}, - {2715, {wxMDIChildFrame, new_4, 4}}, - {2716, {wxMDIChildFrame, destruct, 0}}, - {2717, {wxMDIChildFrame, activate, 0}}, - {2718, {wxMDIChildFrame, create, 4}}, - {2719, {wxMDIChildFrame, maximize, 1}}, - {2720, {wxMDIChildFrame, restore, 0}}, - {2721, {wxMDIClientWindow, new_0, 0}}, - {2722, {wxMDIClientWindow, new_2, 2}}, - {2723, {wxMDIClientWindow, destruct, 0}}, - {2724, {wxMDIClientWindow, createClient, 2}}, - {2725, {wxLayoutAlgorithm, new, 0}}, - {2726, {wxLayoutAlgorithm, layoutFrame, 2}}, - {2727, {wxLayoutAlgorithm, layoutMDIFrame, 2}}, - {2728, {wxLayoutAlgorithm, layoutWindow, 2}}, - {2729, {wxLayoutAlgorithm, 'Destroy', undefined}}, - {2730, {wxEvent, getId, 0}}, - {2731, {wxEvent, getSkipped, 0}}, - {2732, {wxEvent, getTimestamp, 0}}, - {2733, {wxEvent, isCommandEvent, 0}}, - {2734, {wxEvent, resumePropagation, 1}}, - {2735, {wxEvent, shouldPropagate, 0}}, - {2736, {wxEvent, skip, 1}}, - {2737, {wxEvent, stopPropagation, 0}}, - {2738, {wxCommandEvent, getClientData, 0}}, - {2739, {wxCommandEvent, getExtraLong, 0}}, - {2740, {wxCommandEvent, getInt, 0}}, - {2741, {wxCommandEvent, getSelection, 0}}, - {2742, {wxCommandEvent, getString, 0}}, - {2743, {wxCommandEvent, isChecked, 0}}, - {2744, {wxCommandEvent, isSelection, 0}}, - {2745, {wxCommandEvent, setInt, 1}}, - {2746, {wxCommandEvent, setString, 1}}, - {2747, {wxScrollEvent, getOrientation, 0}}, - {2748, {wxScrollEvent, getPosition, 0}}, - {2749, {wxScrollWinEvent, getOrientation, 0}}, - {2750, {wxScrollWinEvent, getPosition, 0}}, - {2751, {wxMouseEvent, altDown, 0}}, - {2752, {wxMouseEvent, button, 1}}, - {2753, {wxMouseEvent, buttonDClick, 1}}, - {2754, {wxMouseEvent, buttonDown, 1}}, - {2755, {wxMouseEvent, buttonUp, 1}}, - {2756, {wxMouseEvent, cmdDown, 0}}, - {2757, {wxMouseEvent, controlDown, 0}}, - {2758, {wxMouseEvent, dragging, 0}}, - {2759, {wxMouseEvent, entering, 0}}, - {2760, {wxMouseEvent, getButton, 0}}, - {2763, {wxMouseEvent, getPosition, 0}}, - {2764, {wxMouseEvent, getLogicalPosition, 1}}, - {2765, {wxMouseEvent, getLinesPerAction, 0}}, - {2766, {wxMouseEvent, getWheelRotation, 0}}, - {2767, {wxMouseEvent, getWheelDelta, 0}}, - {2768, {wxMouseEvent, getX, 0}}, - {2769, {wxMouseEvent, getY, 0}}, - {2770, {wxMouseEvent, isButton, 0}}, - {2771, {wxMouseEvent, isPageScroll, 0}}, - {2772, {wxMouseEvent, leaving, 0}}, - {2773, {wxMouseEvent, leftDClick, 0}}, - {2774, {wxMouseEvent, leftDown, 0}}, - {2775, {wxMouseEvent, leftIsDown, 0}}, - {2776, {wxMouseEvent, leftUp, 0}}, - {2777, {wxMouseEvent, metaDown, 0}}, - {2778, {wxMouseEvent, middleDClick, 0}}, - {2779, {wxMouseEvent, middleDown, 0}}, - {2780, {wxMouseEvent, middleIsDown, 0}}, - {2781, {wxMouseEvent, middleUp, 0}}, - {2782, {wxMouseEvent, moving, 0}}, - {2783, {wxMouseEvent, rightDClick, 0}}, - {2784, {wxMouseEvent, rightDown, 0}}, - {2785, {wxMouseEvent, rightIsDown, 0}}, - {2786, {wxMouseEvent, rightUp, 0}}, - {2787, {wxMouseEvent, shiftDown, 0}}, - {2788, {wxSetCursorEvent, getCursor, 0}}, - {2789, {wxSetCursorEvent, getX, 0}}, - {2790, {wxSetCursorEvent, getY, 0}}, - {2791, {wxSetCursorEvent, hasCursor, 0}}, - {2792, {wxSetCursorEvent, setCursor, 1}}, - {2793, {wxKeyEvent, altDown, 0}}, - {2794, {wxKeyEvent, cmdDown, 0}}, - {2795, {wxKeyEvent, controlDown, 0}}, - {2796, {wxKeyEvent, getKeyCode, 0}}, - {2797, {wxKeyEvent, getModifiers, 0}}, - {2800, {wxKeyEvent, getPosition, 0}}, - {2801, {wxKeyEvent, getRawKeyCode, 0}}, - {2802, {wxKeyEvent, getRawKeyFlags, 0}}, - {2803, {wxKeyEvent, getUnicodeKey, 0}}, - {2804, {wxKeyEvent, getX, 0}}, - {2805, {wxKeyEvent, getY, 0}}, - {2806, {wxKeyEvent, hasModifiers, 0}}, - {2807, {wxKeyEvent, metaDown, 0}}, - {2808, {wxKeyEvent, shiftDown, 0}}, - {2809, {wxSizeEvent, getSize, 0}}, - {2810, {wxMoveEvent, getPosition, 0}}, - {2811, {wxEraseEvent, getDC, 0}}, - {2812, {wxFocusEvent, getWindow, 0}}, - {2813, {wxChildFocusEvent, getWindow, 0}}, - {2814, {wxMenuEvent, getMenu, 0}}, - {2815, {wxMenuEvent, getMenuId, 0}}, - {2816, {wxMenuEvent, isPopup, 0}}, - {2817, {wxCloseEvent, canVeto, 0}}, - {2818, {wxCloseEvent, getLoggingOff, 0}}, - {2819, {wxCloseEvent, setCanVeto, 1}}, - {2820, {wxCloseEvent, setLoggingOff, 1}}, - {2821, {wxCloseEvent, veto, 1}}, - {2822, {wxShowEvent, setShow, 1}}, - {2823, {wxShowEvent, getShow, 0}}, - {2824, {wxIconizeEvent, iconized, 0}}, - {2825, {wxJoystickEvent, buttonDown, 1}}, - {2826, {wxJoystickEvent, buttonIsDown, 1}}, - {2827, {wxJoystickEvent, buttonUp, 1}}, - {2828, {wxJoystickEvent, getButtonChange, 0}}, - {2829, {wxJoystickEvent, getButtonState, 0}}, - {2830, {wxJoystickEvent, getJoystick, 0}}, - {2831, {wxJoystickEvent, getPosition, 0}}, - {2832, {wxJoystickEvent, getZPosition, 0}}, - {2833, {wxJoystickEvent, isButton, 0}}, - {2834, {wxJoystickEvent, isMove, 0}}, - {2835, {wxJoystickEvent, isZMove, 0}}, - {2836, {wxUpdateUIEvent, canUpdate, 1}}, - {2837, {wxUpdateUIEvent, check, 1}}, - {2838, {wxUpdateUIEvent, enable, 1}}, - {2839, {wxUpdateUIEvent, show, 1}}, - {2840, {wxUpdateUIEvent, getChecked, 0}}, - {2841, {wxUpdateUIEvent, getEnabled, 0}}, - {2842, {wxUpdateUIEvent, getShown, 0}}, - {2843, {wxUpdateUIEvent, getSetChecked, 0}}, - {2844, {wxUpdateUIEvent, getSetEnabled, 0}}, - {2845, {wxUpdateUIEvent, getSetShown, 0}}, - {2846, {wxUpdateUIEvent, getSetText, 0}}, - {2847, {wxUpdateUIEvent, getText, 0}}, - {2848, {wxUpdateUIEvent, getMode, 0}}, - {2849, {wxUpdateUIEvent, getUpdateInterval, 0}}, - {2850, {wxUpdateUIEvent, resetUpdateTime, 0}}, - {2851, {wxUpdateUIEvent, setMode, 1}}, - {2852, {wxUpdateUIEvent, setText, 1}}, - {2853, {wxUpdateUIEvent, setUpdateInterval, 1}}, - {2854, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}}, - {2855, {wxPaletteChangedEvent, setChangedWindow, 1}}, - {2856, {wxPaletteChangedEvent, getChangedWindow, 0}}, - {2857, {wxQueryNewPaletteEvent, setPaletteRealized, 1}}, - {2858, {wxQueryNewPaletteEvent, getPaletteRealized, 0}}, - {2859, {wxNavigationKeyEvent, getDirection, 0}}, - {2860, {wxNavigationKeyEvent, setDirection, 1}}, - {2861, {wxNavigationKeyEvent, isWindowChange, 0}}, - {2862, {wxNavigationKeyEvent, setWindowChange, 1}}, - {2863, {wxNavigationKeyEvent, isFromTab, 0}}, - {2864, {wxNavigationKeyEvent, setFromTab, 1}}, - {2865, {wxNavigationKeyEvent, getCurrentFocus, 0}}, - {2866, {wxNavigationKeyEvent, setCurrentFocus, 1}}, - {2867, {wxHelpEvent, getOrigin, 0}}, - {2868, {wxHelpEvent, getPosition, 0}}, - {2869, {wxHelpEvent, setOrigin, 1}}, - {2870, {wxHelpEvent, setPosition, 1}}, - {2871, {wxContextMenuEvent, getPosition, 0}}, - {2872, {wxContextMenuEvent, setPosition, 1}}, - {2873, {wxIdleEvent, canSend, 1}}, - {2874, {wxIdleEvent, getMode, 0}}, - {2875, {wxIdleEvent, requestMore, 1}}, - {2876, {wxIdleEvent, moreRequested, 0}}, - {2877, {wxIdleEvent, setMode, 1}}, - {2878, {wxGridEvent, altDown, 0}}, - {2879, {wxGridEvent, controlDown, 0}}, - {2880, {wxGridEvent, getCol, 0}}, - {2881, {wxGridEvent, getPosition, 0}}, - {2882, {wxGridEvent, getRow, 0}}, - {2883, {wxGridEvent, metaDown, 0}}, - {2884, {wxGridEvent, selecting, 0}}, - {2885, {wxGridEvent, shiftDown, 0}}, - {2886, {wxNotifyEvent, allow, 0}}, - {2887, {wxNotifyEvent, isAllowed, 0}}, - {2888, {wxNotifyEvent, veto, 0}}, - {2889, {wxSashEvent, getEdge, 0}}, - {2890, {wxSashEvent, getDragRect, 0}}, - {2891, {wxSashEvent, getDragStatus, 0}}, - {2892, {wxListEvent, getCacheFrom, 0}}, - {2893, {wxListEvent, getCacheTo, 0}}, - {2894, {wxListEvent, getKeyCode, 0}}, - {2895, {wxListEvent, getIndex, 0}}, - {2896, {wxListEvent, getColumn, 0}}, - {2897, {wxListEvent, getPoint, 0}}, - {2898, {wxListEvent, getLabel, 0}}, - {2899, {wxListEvent, getText, 0}}, - {2900, {wxListEvent, getImage, 0}}, - {2901, {wxListEvent, getData, 0}}, - {2902, {wxListEvent, getMask, 0}}, - {2903, {wxListEvent, getItem, 0}}, - {2904, {wxListEvent, isEditCancelled, 0}}, - {2905, {wxDateEvent, getDate, 0}}, - {2906, {wxCalendarEvent, getWeekDay, 0}}, - {2907, {wxFileDirPickerEvent, getPath, 0}}, - {2908, {wxColourPickerEvent, getColour, 0}}, - {2909, {wxFontPickerEvent, getFont, 0}}, - {2910, {wxStyledTextEvent, getPosition, 0}}, - {2911, {wxStyledTextEvent, getKey, 0}}, - {2912, {wxStyledTextEvent, getModifiers, 0}}, - {2913, {wxStyledTextEvent, getModificationType, 0}}, - {2914, {wxStyledTextEvent, getText, 0}}, - {2915, {wxStyledTextEvent, getLength, 0}}, - {2916, {wxStyledTextEvent, getLinesAdded, 0}}, - {2917, {wxStyledTextEvent, getLine, 0}}, - {2918, {wxStyledTextEvent, getFoldLevelNow, 0}}, - {2919, {wxStyledTextEvent, getFoldLevelPrev, 0}}, - {2920, {wxStyledTextEvent, getMargin, 0}}, - {2921, {wxStyledTextEvent, getMessage, 0}}, - {2922, {wxStyledTextEvent, getWParam, 0}}, - {2923, {wxStyledTextEvent, getLParam, 0}}, - {2924, {wxStyledTextEvent, getListType, 0}}, - {2925, {wxStyledTextEvent, getX, 0}}, - {2926, {wxStyledTextEvent, getY, 0}}, - {2927, {wxStyledTextEvent, getDragText, 0}}, - {2928, {wxStyledTextEvent, getDragAllowMove, 0}}, - {2929, {wxStyledTextEvent, getDragResult, 0}}, - {2930, {wxStyledTextEvent, getShift, 0}}, - {2931, {wxStyledTextEvent, getControl, 0}}, - {2932, {wxStyledTextEvent, getAlt, 0}}, - {2933, {utils, getKeyState, 1}}, - {2934, {utils, getMousePosition, 2}}, - {2935, {utils, getMouseState, 0}}, - {2936, {utils, setDetectableAutoRepeat, 1}}, - {2937, {utils, bell, 0}}, - {2938, {utils, findMenuItemId, 3}}, - {2939, {utils, genericFindWindowAtPoint, 1}}, - {2940, {utils, findWindowAtPoint, 1}}, - {2941, {utils, beginBusyCursor, 1}}, - {2942, {utils, endBusyCursor, 0}}, - {2943, {utils, isBusy, 0}}, - {2944, {utils, shutdown, 1}}, - {2945, {utils, shell, 1}}, - {2946, {utils, launchDefaultBrowser, 2}}, - {2947, {utils, getEmailAddress, 0}}, - {2948, {utils, getUserId, 0}}, - {2949, {utils, getHomeDir, 0}}, - {2950, {utils, newId, 0}}, - {2951, {utils, registerId, 1}}, - {2952, {utils, getCurrentId, 0}}, - {2953, {utils, getOsDescription, 0}}, - {2954, {utils, isPlatformLittleEndian, 0}}, - {2955, {utils, isPlatform64Bit, 0}}, - {2956, {gdicmn, displaySize, 2}}, - {2957, {gdicmn, setCursor, 1}}, - {2958, {wxPrintout, new, 1}}, - {2959, {wxPrintout, destruct, 0}}, - {2960, {wxPrintout, getDC, 0}}, - {2961, {wxPrintout, getPageSizeMM, 2}}, - {2962, {wxPrintout, getPageSizePixels, 2}}, - {2963, {wxPrintout, getPaperRectPixels, 0}}, - {2964, {wxPrintout, getPPIPrinter, 2}}, - {2965, {wxPrintout, getPPIScreen, 2}}, - {2966, {wxPrintout, getTitle, 0}}, - {2967, {wxPrintout, isPreview, 0}}, - {2968, {wxPrintout, fitThisSizeToPaper, 1}}, - {2969, {wxPrintout, fitThisSizeToPage, 1}}, - {2970, {wxPrintout, fitThisSizeToPageMargins, 2}}, - {2971, {wxPrintout, mapScreenSizeToPaper, 0}}, - {2972, {wxPrintout, mapScreenSizeToPage, 0}}, - {2973, {wxPrintout, mapScreenSizeToPageMargins, 1}}, - {2974, {wxPrintout, mapScreenSizeToDevice, 0}}, - {2975, {wxPrintout, getLogicalPaperRect, 0}}, - {2976, {wxPrintout, getLogicalPageRect, 0}}, - {2977, {wxPrintout, getLogicalPageMarginsRect, 1}}, - {2978, {wxPrintout, setLogicalOrigin, 2}}, - {2979, {wxPrintout, offsetLogicalOrigin, 2}}, - {2980, {wxStyledTextCtrl, new_2, 2}}, - {2981, {wxStyledTextCtrl, new_0, 0}}, - {2982, {wxStyledTextCtrl, destruct, 0}}, - {2983, {wxStyledTextCtrl, create, 2}}, - {2984, {wxStyledTextCtrl, addText, 1}}, - {2985, {wxStyledTextCtrl, addStyledText, 1}}, - {2986, {wxStyledTextCtrl, insertText, 2}}, - {2987, {wxStyledTextCtrl, clearAll, 0}}, - {2988, {wxStyledTextCtrl, clearDocumentStyle, 0}}, - {2989, {wxStyledTextCtrl, getLength, 0}}, - {2990, {wxStyledTextCtrl, getCharAt, 1}}, - {2991, {wxStyledTextCtrl, getCurrentPos, 0}}, - {2992, {wxStyledTextCtrl, getAnchor, 0}}, - {2993, {wxStyledTextCtrl, getStyleAt, 1}}, - {2994, {wxStyledTextCtrl, redo, 0}}, - {2995, {wxStyledTextCtrl, setUndoCollection, 1}}, - {2996, {wxStyledTextCtrl, selectAll, 0}}, - {2997, {wxStyledTextCtrl, setSavePoint, 0}}, - {2998, {wxStyledTextCtrl, getStyledText, 2}}, - {2999, {wxStyledTextCtrl, canRedo, 0}}, - {3000, {wxStyledTextCtrl, markerLineFromHandle, 1}}, - {3001, {wxStyledTextCtrl, markerDeleteHandle, 1}}, - {3002, {wxStyledTextCtrl, getUndoCollection, 0}}, - {3003, {wxStyledTextCtrl, getViewWhiteSpace, 0}}, - {3004, {wxStyledTextCtrl, setViewWhiteSpace, 1}}, - {3005, {wxStyledTextCtrl, positionFromPoint, 1}}, - {3006, {wxStyledTextCtrl, positionFromPointClose, 2}}, - {3007, {wxStyledTextCtrl, gotoLine, 1}}, - {3008, {wxStyledTextCtrl, gotoPos, 1}}, - {3009, {wxStyledTextCtrl, setAnchor, 1}}, - {3010, {wxStyledTextCtrl, getCurLine, 1}}, - {3011, {wxStyledTextCtrl, getEndStyled, 0}}, - {3012, {wxStyledTextCtrl, convertEOLs, 1}}, - {3013, {wxStyledTextCtrl, getEOLMode, 0}}, - {3014, {wxStyledTextCtrl, setEOLMode, 1}}, - {3015, {wxStyledTextCtrl, startStyling, 2}}, - {3016, {wxStyledTextCtrl, setStyling, 2}}, - {3017, {wxStyledTextCtrl, getBufferedDraw, 0}}, - {3018, {wxStyledTextCtrl, setBufferedDraw, 1}}, - {3019, {wxStyledTextCtrl, setTabWidth, 1}}, - {3020, {wxStyledTextCtrl, getTabWidth, 0}}, - {3021, {wxStyledTextCtrl, setCodePage, 1}}, - {3022, {wxStyledTextCtrl, markerDefine, 3}}, - {3023, {wxStyledTextCtrl, markerSetForeground, 2}}, - {3024, {wxStyledTextCtrl, markerSetBackground, 2}}, - {3025, {wxStyledTextCtrl, markerAdd, 2}}, - {3026, {wxStyledTextCtrl, markerDelete, 2}}, - {3027, {wxStyledTextCtrl, markerDeleteAll, 1}}, - {3028, {wxStyledTextCtrl, markerGet, 1}}, - {3029, {wxStyledTextCtrl, markerNext, 2}}, - {3030, {wxStyledTextCtrl, markerPrevious, 2}}, - {3031, {wxStyledTextCtrl, markerDefineBitmap, 2}}, - {3032, {wxStyledTextCtrl, markerAddSet, 2}}, - {3033, {wxStyledTextCtrl, markerSetAlpha, 2}}, - {3034, {wxStyledTextCtrl, setMarginType, 2}}, - {3035, {wxStyledTextCtrl, getMarginType, 1}}, - {3036, {wxStyledTextCtrl, setMarginWidth, 2}}, - {3037, {wxStyledTextCtrl, getMarginWidth, 1}}, - {3038, {wxStyledTextCtrl, setMarginMask, 2}}, - {3039, {wxStyledTextCtrl, getMarginMask, 1}}, - {3040, {wxStyledTextCtrl, setMarginSensitive, 2}}, - {3041, {wxStyledTextCtrl, getMarginSensitive, 1}}, - {3042, {wxStyledTextCtrl, styleClearAll, 0}}, - {3043, {wxStyledTextCtrl, styleSetForeground, 2}}, - {3044, {wxStyledTextCtrl, styleSetBackground, 2}}, - {3045, {wxStyledTextCtrl, styleSetBold, 2}}, - {3046, {wxStyledTextCtrl, styleSetItalic, 2}}, - {3047, {wxStyledTextCtrl, styleSetSize, 2}}, - {3048, {wxStyledTextCtrl, styleSetFaceName, 2}}, - {3049, {wxStyledTextCtrl, styleSetEOLFilled, 2}}, - {3050, {wxStyledTextCtrl, styleResetDefault, 0}}, - {3051, {wxStyledTextCtrl, styleSetUnderline, 2}}, - {3052, {wxStyledTextCtrl, styleSetCase, 2}}, - {3053, {wxStyledTextCtrl, styleSetHotSpot, 2}}, - {3054, {wxStyledTextCtrl, setSelForeground, 2}}, - {3055, {wxStyledTextCtrl, setSelBackground, 2}}, - {3056, {wxStyledTextCtrl, getSelAlpha, 0}}, - {3057, {wxStyledTextCtrl, setSelAlpha, 1}}, - {3058, {wxStyledTextCtrl, setCaretForeground, 1}}, - {3059, {wxStyledTextCtrl, cmdKeyAssign, 3}}, - {3060, {wxStyledTextCtrl, cmdKeyClear, 2}}, - {3061, {wxStyledTextCtrl, cmdKeyClearAll, 0}}, - {3062, {wxStyledTextCtrl, setStyleBytes, 2}}, - {3063, {wxStyledTextCtrl, styleSetVisible, 2}}, - {3064, {wxStyledTextCtrl, getCaretPeriod, 0}}, - {3065, {wxStyledTextCtrl, setCaretPeriod, 1}}, - {3066, {wxStyledTextCtrl, setWordChars, 1}}, - {3067, {wxStyledTextCtrl, beginUndoAction, 0}}, - {3068, {wxStyledTextCtrl, endUndoAction, 0}}, - {3069, {wxStyledTextCtrl, indicatorSetStyle, 2}}, - {3070, {wxStyledTextCtrl, indicatorGetStyle, 1}}, - {3071, {wxStyledTextCtrl, indicatorSetForeground, 2}}, - {3072, {wxStyledTextCtrl, indicatorGetForeground, 1}}, - {3073, {wxStyledTextCtrl, setWhitespaceForeground, 2}}, - {3074, {wxStyledTextCtrl, setWhitespaceBackground, 2}}, - {3075, {wxStyledTextCtrl, getStyleBits, 0}}, - {3076, {wxStyledTextCtrl, setLineState, 2}}, - {3077, {wxStyledTextCtrl, getLineState, 1}}, - {3078, {wxStyledTextCtrl, getMaxLineState, 0}}, - {3079, {wxStyledTextCtrl, getCaretLineVisible, 0}}, - {3080, {wxStyledTextCtrl, setCaretLineVisible, 1}}, - {3081, {wxStyledTextCtrl, getCaretLineBackground, 0}}, - {3082, {wxStyledTextCtrl, setCaretLineBackground, 1}}, - {3083, {wxStyledTextCtrl, autoCompShow, 2}}, - {3084, {wxStyledTextCtrl, autoCompCancel, 0}}, - {3085, {wxStyledTextCtrl, autoCompActive, 0}}, - {3086, {wxStyledTextCtrl, autoCompPosStart, 0}}, - {3087, {wxStyledTextCtrl, autoCompComplete, 0}}, - {3088, {wxStyledTextCtrl, autoCompStops, 1}}, - {3089, {wxStyledTextCtrl, autoCompSetSeparator, 1}}, - {3090, {wxStyledTextCtrl, autoCompGetSeparator, 0}}, - {3091, {wxStyledTextCtrl, autoCompSelect, 1}}, - {3092, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}}, - {3093, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}}, - {3094, {wxStyledTextCtrl, autoCompSetFillUps, 1}}, - {3095, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}}, - {3096, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}}, - {3097, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}}, - {3098, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}}, - {3099, {wxStyledTextCtrl, userListShow, 2}}, - {3100, {wxStyledTextCtrl, autoCompSetAutoHide, 1}}, - {3101, {wxStyledTextCtrl, autoCompGetAutoHide, 0}}, - {3102, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}}, - {3103, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}}, - {3104, {wxStyledTextCtrl, registerImage, 2}}, - {3105, {wxStyledTextCtrl, clearRegisteredImages, 0}}, - {3106, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}}, - {3107, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}}, - {3108, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}}, - {3109, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}}, - {3110, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}}, - {3111, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}}, - {3112, {wxStyledTextCtrl, setIndent, 1}}, - {3113, {wxStyledTextCtrl, getIndent, 0}}, - {3114, {wxStyledTextCtrl, setUseTabs, 1}}, - {3115, {wxStyledTextCtrl, getUseTabs, 0}}, - {3116, {wxStyledTextCtrl, setLineIndentation, 2}}, - {3117, {wxStyledTextCtrl, getLineIndentation, 1}}, - {3118, {wxStyledTextCtrl, getLineIndentPosition, 1}}, - {3119, {wxStyledTextCtrl, getColumn, 1}}, - {3120, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}}, - {3121, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}}, - {3122, {wxStyledTextCtrl, setIndentationGuides, 1}}, - {3123, {wxStyledTextCtrl, getIndentationGuides, 0}}, - {3124, {wxStyledTextCtrl, setHighlightGuide, 1}}, - {3125, {wxStyledTextCtrl, getHighlightGuide, 0}}, - {3126, {wxStyledTextCtrl, getLineEndPosition, 1}}, - {3127, {wxStyledTextCtrl, getCodePage, 0}}, - {3128, {wxStyledTextCtrl, getCaretForeground, 0}}, - {3129, {wxStyledTextCtrl, getReadOnly, 0}}, - {3130, {wxStyledTextCtrl, setCurrentPos, 1}}, - {3131, {wxStyledTextCtrl, setSelectionStart, 1}}, - {3132, {wxStyledTextCtrl, getSelectionStart, 0}}, - {3133, {wxStyledTextCtrl, setSelectionEnd, 1}}, - {3134, {wxStyledTextCtrl, getSelectionEnd, 0}}, - {3135, {wxStyledTextCtrl, setPrintMagnification, 1}}, - {3136, {wxStyledTextCtrl, getPrintMagnification, 0}}, - {3137, {wxStyledTextCtrl, setPrintColourMode, 1}}, - {3138, {wxStyledTextCtrl, getPrintColourMode, 0}}, - {3139, {wxStyledTextCtrl, findText, 4}}, - {3140, {wxStyledTextCtrl, formatRange, 7}}, - {3141, {wxStyledTextCtrl, getFirstVisibleLine, 0}}, - {3142, {wxStyledTextCtrl, getLine, 1}}, - {3143, {wxStyledTextCtrl, getLineCount, 0}}, - {3144, {wxStyledTextCtrl, setMarginLeft, 1}}, - {3145, {wxStyledTextCtrl, getMarginLeft, 0}}, - {3146, {wxStyledTextCtrl, setMarginRight, 1}}, - {3147, {wxStyledTextCtrl, getMarginRight, 0}}, - {3148, {wxStyledTextCtrl, getModify, 0}}, - {3149, {wxStyledTextCtrl, setSelection, 2}}, - {3150, {wxStyledTextCtrl, getSelectedText, 0}}, - {3151, {wxStyledTextCtrl, getTextRange, 2}}, - {3152, {wxStyledTextCtrl, hideSelection, 1}}, - {3153, {wxStyledTextCtrl, lineFromPosition, 1}}, - {3154, {wxStyledTextCtrl, positionFromLine, 1}}, - {3155, {wxStyledTextCtrl, lineScroll, 2}}, - {3156, {wxStyledTextCtrl, ensureCaretVisible, 0}}, - {3157, {wxStyledTextCtrl, replaceSelection, 1}}, - {3158, {wxStyledTextCtrl, setReadOnly, 1}}, - {3159, {wxStyledTextCtrl, canPaste, 0}}, - {3160, {wxStyledTextCtrl, canUndo, 0}}, - {3161, {wxStyledTextCtrl, emptyUndoBuffer, 0}}, - {3162, {wxStyledTextCtrl, undo, 0}}, - {3163, {wxStyledTextCtrl, cut, 0}}, - {3164, {wxStyledTextCtrl, copy, 0}}, - {3165, {wxStyledTextCtrl, paste, 0}}, - {3166, {wxStyledTextCtrl, clear, 0}}, - {3167, {wxStyledTextCtrl, setText, 1}}, - {3168, {wxStyledTextCtrl, getText, 0}}, - {3169, {wxStyledTextCtrl, getTextLength, 0}}, - {3170, {wxStyledTextCtrl, getOvertype, 0}}, - {3171, {wxStyledTextCtrl, setCaretWidth, 1}}, - {3172, {wxStyledTextCtrl, getCaretWidth, 0}}, - {3173, {wxStyledTextCtrl, setTargetStart, 1}}, - {3174, {wxStyledTextCtrl, getTargetStart, 0}}, - {3175, {wxStyledTextCtrl, setTargetEnd, 1}}, - {3176, {wxStyledTextCtrl, getTargetEnd, 0}}, - {3177, {wxStyledTextCtrl, replaceTarget, 1}}, - {3178, {wxStyledTextCtrl, searchInTarget, 1}}, - {3179, {wxStyledTextCtrl, setSearchFlags, 1}}, - {3180, {wxStyledTextCtrl, getSearchFlags, 0}}, - {3181, {wxStyledTextCtrl, callTipShow, 2}}, - {3182, {wxStyledTextCtrl, callTipCancel, 0}}, - {3183, {wxStyledTextCtrl, callTipActive, 0}}, - {3184, {wxStyledTextCtrl, callTipPosAtStart, 0}}, - {3185, {wxStyledTextCtrl, callTipSetHighlight, 2}}, - {3186, {wxStyledTextCtrl, callTipSetBackground, 1}}, - {3187, {wxStyledTextCtrl, callTipSetForeground, 1}}, - {3188, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}}, - {3189, {wxStyledTextCtrl, callTipUseStyle, 1}}, - {3190, {wxStyledTextCtrl, visibleFromDocLine, 1}}, - {3191, {wxStyledTextCtrl, docLineFromVisible, 1}}, - {3192, {wxStyledTextCtrl, wrapCount, 1}}, - {3193, {wxStyledTextCtrl, setFoldLevel, 2}}, - {3194, {wxStyledTextCtrl, getFoldLevel, 1}}, - {3195, {wxStyledTextCtrl, getLastChild, 2}}, - {3196, {wxStyledTextCtrl, getFoldParent, 1}}, - {3197, {wxStyledTextCtrl, showLines, 2}}, - {3198, {wxStyledTextCtrl, hideLines, 2}}, - {3199, {wxStyledTextCtrl, getLineVisible, 1}}, - {3200, {wxStyledTextCtrl, setFoldExpanded, 2}}, - {3201, {wxStyledTextCtrl, getFoldExpanded, 1}}, - {3202, {wxStyledTextCtrl, toggleFold, 1}}, - {3203, {wxStyledTextCtrl, ensureVisible, 1}}, - {3204, {wxStyledTextCtrl, setFoldFlags, 1}}, - {3205, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}}, - {3206, {wxStyledTextCtrl, setTabIndents, 1}}, - {3207, {wxStyledTextCtrl, getTabIndents, 0}}, - {3208, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}}, - {3209, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}}, - {3210, {wxStyledTextCtrl, setMouseDwellTime, 1}}, - {3211, {wxStyledTextCtrl, getMouseDwellTime, 0}}, - {3212, {wxStyledTextCtrl, wordStartPosition, 2}}, - {3213, {wxStyledTextCtrl, wordEndPosition, 2}}, - {3214, {wxStyledTextCtrl, setWrapMode, 1}}, - {3215, {wxStyledTextCtrl, getWrapMode, 0}}, - {3216, {wxStyledTextCtrl, setWrapVisualFlags, 1}}, - {3217, {wxStyledTextCtrl, getWrapVisualFlags, 0}}, - {3218, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}}, - {3219, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}}, - {3220, {wxStyledTextCtrl, setWrapStartIndent, 1}}, - {3221, {wxStyledTextCtrl, getWrapStartIndent, 0}}, - {3222, {wxStyledTextCtrl, setLayoutCache, 1}}, - {3223, {wxStyledTextCtrl, getLayoutCache, 0}}, - {3224, {wxStyledTextCtrl, setScrollWidth, 1}}, - {3225, {wxStyledTextCtrl, getScrollWidth, 0}}, - {3226, {wxStyledTextCtrl, textWidth, 2}}, - {3227, {wxStyledTextCtrl, getEndAtLastLine, 0}}, - {3228, {wxStyledTextCtrl, textHeight, 1}}, - {3229, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}}, - {3230, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}}, - {3231, {wxStyledTextCtrl, appendText, 1}}, - {3232, {wxStyledTextCtrl, getTwoPhaseDraw, 0}}, - {3233, {wxStyledTextCtrl, setTwoPhaseDraw, 1}}, - {3234, {wxStyledTextCtrl, targetFromSelection, 0}}, - {3235, {wxStyledTextCtrl, linesJoin, 0}}, - {3236, {wxStyledTextCtrl, linesSplit, 1}}, - {3237, {wxStyledTextCtrl, setFoldMarginColour, 2}}, - {3238, {wxStyledTextCtrl, setFoldMarginHiColour, 2}}, - {3239, {wxStyledTextCtrl, lineDown, 0}}, - {3240, {wxStyledTextCtrl, lineDownExtend, 0}}, - {3241, {wxStyledTextCtrl, lineUp, 0}}, - {3242, {wxStyledTextCtrl, lineUpExtend, 0}}, - {3243, {wxStyledTextCtrl, charLeft, 0}}, - {3244, {wxStyledTextCtrl, charLeftExtend, 0}}, - {3245, {wxStyledTextCtrl, charRight, 0}}, - {3246, {wxStyledTextCtrl, charRightExtend, 0}}, - {3247, {wxStyledTextCtrl, wordLeft, 0}}, - {3248, {wxStyledTextCtrl, wordLeftExtend, 0}}, - {3249, {wxStyledTextCtrl, wordRight, 0}}, - {3250, {wxStyledTextCtrl, wordRightExtend, 0}}, - {3251, {wxStyledTextCtrl, home, 0}}, - {3252, {wxStyledTextCtrl, homeExtend, 0}}, - {3253, {wxStyledTextCtrl, lineEnd, 0}}, - {3254, {wxStyledTextCtrl, lineEndExtend, 0}}, - {3255, {wxStyledTextCtrl, documentStart, 0}}, - {3256, {wxStyledTextCtrl, documentStartExtend, 0}}, - {3257, {wxStyledTextCtrl, documentEnd, 0}}, - {3258, {wxStyledTextCtrl, documentEndExtend, 0}}, - {3259, {wxStyledTextCtrl, pageUp, 0}}, - {3260, {wxStyledTextCtrl, pageUpExtend, 0}}, - {3261, {wxStyledTextCtrl, pageDown, 0}}, - {3262, {wxStyledTextCtrl, pageDownExtend, 0}}, - {3263, {wxStyledTextCtrl, editToggleOvertype, 0}}, - {3264, {wxStyledTextCtrl, cancel, 0}}, - {3265, {wxStyledTextCtrl, deleteBack, 0}}, - {3266, {wxStyledTextCtrl, tab, 0}}, - {3267, {wxStyledTextCtrl, backTab, 0}}, - {3268, {wxStyledTextCtrl, newLine, 0}}, - {3269, {wxStyledTextCtrl, formFeed, 0}}, - {3270, {wxStyledTextCtrl, vCHome, 0}}, - {3271, {wxStyledTextCtrl, vCHomeExtend, 0}}, - {3272, {wxStyledTextCtrl, zoomIn, 0}}, - {3273, {wxStyledTextCtrl, zoomOut, 0}}, - {3274, {wxStyledTextCtrl, delWordLeft, 0}}, - {3275, {wxStyledTextCtrl, delWordRight, 0}}, - {3276, {wxStyledTextCtrl, lineCut, 0}}, - {3277, {wxStyledTextCtrl, lineDelete, 0}}, - {3278, {wxStyledTextCtrl, lineTranspose, 0}}, - {3279, {wxStyledTextCtrl, lineDuplicate, 0}}, - {3280, {wxStyledTextCtrl, lowerCase, 0}}, - {3281, {wxStyledTextCtrl, upperCase, 0}}, - {3282, {wxStyledTextCtrl, lineScrollDown, 0}}, - {3283, {wxStyledTextCtrl, lineScrollUp, 0}}, - {3284, {wxStyledTextCtrl, deleteBackNotLine, 0}}, - {3285, {wxStyledTextCtrl, homeDisplay, 0}}, - {3286, {wxStyledTextCtrl, homeDisplayExtend, 0}}, - {3287, {wxStyledTextCtrl, lineEndDisplay, 0}}, - {3288, {wxStyledTextCtrl, lineEndDisplayExtend, 0}}, - {3289, {wxStyledTextCtrl, homeWrapExtend, 0}}, - {3290, {wxStyledTextCtrl, lineEndWrap, 0}}, - {3291, {wxStyledTextCtrl, lineEndWrapExtend, 0}}, - {3292, {wxStyledTextCtrl, vCHomeWrap, 0}}, - {3293, {wxStyledTextCtrl, vCHomeWrapExtend, 0}}, - {3294, {wxStyledTextCtrl, lineCopy, 0}}, - {3295, {wxStyledTextCtrl, moveCaretInsideView, 0}}, - {3296, {wxStyledTextCtrl, lineLength, 1}}, - {3297, {wxStyledTextCtrl, braceHighlight, 2}}, - {3298, {wxStyledTextCtrl, braceBadLight, 1}}, - {3299, {wxStyledTextCtrl, braceMatch, 1}}, - {3300, {wxStyledTextCtrl, getViewEOL, 0}}, - {3301, {wxStyledTextCtrl, setViewEOL, 1}}, - {3302, {wxStyledTextCtrl, setModEventMask, 1}}, - {3303, {wxStyledTextCtrl, getEdgeColumn, 0}}, - {3304, {wxStyledTextCtrl, setEdgeColumn, 1}}, - {3305, {wxStyledTextCtrl, setEdgeMode, 1}}, - {3306, {wxStyledTextCtrl, getEdgeMode, 0}}, - {3307, {wxStyledTextCtrl, getEdgeColour, 0}}, - {3308, {wxStyledTextCtrl, setEdgeColour, 1}}, - {3309, {wxStyledTextCtrl, searchAnchor, 0}}, - {3310, {wxStyledTextCtrl, searchNext, 2}}, - {3311, {wxStyledTextCtrl, searchPrev, 2}}, - {3312, {wxStyledTextCtrl, linesOnScreen, 0}}, - {3313, {wxStyledTextCtrl, usePopUp, 1}}, - {3314, {wxStyledTextCtrl, selectionIsRectangle, 0}}, - {3315, {wxStyledTextCtrl, setZoom, 1}}, - {3316, {wxStyledTextCtrl, getZoom, 0}}, - {3317, {wxStyledTextCtrl, getModEventMask, 0}}, - {3318, {wxStyledTextCtrl, setSTCFocus, 1}}, - {3319, {wxStyledTextCtrl, getSTCFocus, 0}}, - {3320, {wxStyledTextCtrl, setStatus, 1}}, - {3321, {wxStyledTextCtrl, getStatus, 0}}, - {3322, {wxStyledTextCtrl, setMouseDownCaptures, 1}}, - {3323, {wxStyledTextCtrl, getMouseDownCaptures, 0}}, - {3324, {wxStyledTextCtrl, setSTCCursor, 1}}, - {3325, {wxStyledTextCtrl, getSTCCursor, 0}}, - {3326, {wxStyledTextCtrl, setControlCharSymbol, 1}}, - {3327, {wxStyledTextCtrl, getControlCharSymbol, 0}}, - {3328, {wxStyledTextCtrl, wordPartLeft, 0}}, - {3329, {wxStyledTextCtrl, wordPartLeftExtend, 0}}, - {3330, {wxStyledTextCtrl, wordPartRight, 0}}, - {3331, {wxStyledTextCtrl, wordPartRightExtend, 0}}, - {3332, {wxStyledTextCtrl, setVisiblePolicy, 2}}, - {3333, {wxStyledTextCtrl, delLineLeft, 0}}, - {3334, {wxStyledTextCtrl, delLineRight, 0}}, - {3335, {wxStyledTextCtrl, getXOffset, 0}}, - {3336, {wxStyledTextCtrl, chooseCaretX, 0}}, - {3337, {wxStyledTextCtrl, setXCaretPolicy, 2}}, - {3338, {wxStyledTextCtrl, setYCaretPolicy, 2}}, - {3339, {wxStyledTextCtrl, getPrintWrapMode, 0}}, - {3340, {wxStyledTextCtrl, setHotspotActiveForeground, 2}}, - {3341, {wxStyledTextCtrl, setHotspotActiveBackground, 2}}, - {3342, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}}, - {3343, {wxStyledTextCtrl, setHotspotSingleLine, 1}}, - {3344, {wxStyledTextCtrl, paraDownExtend, 0}}, - {3345, {wxStyledTextCtrl, paraUp, 0}}, - {3346, {wxStyledTextCtrl, paraUpExtend, 0}}, - {3347, {wxStyledTextCtrl, positionBefore, 1}}, - {3348, {wxStyledTextCtrl, positionAfter, 1}}, - {3349, {wxStyledTextCtrl, copyRange, 2}}, - {3350, {wxStyledTextCtrl, copyText, 2}}, - {3351, {wxStyledTextCtrl, setSelectionMode, 1}}, - {3352, {wxStyledTextCtrl, getSelectionMode, 0}}, - {3353, {wxStyledTextCtrl, lineDownRectExtend, 0}}, - {3354, {wxStyledTextCtrl, lineUpRectExtend, 0}}, - {3355, {wxStyledTextCtrl, charLeftRectExtend, 0}}, - {3356, {wxStyledTextCtrl, charRightRectExtend, 0}}, - {3357, {wxStyledTextCtrl, homeRectExtend, 0}}, - {3358, {wxStyledTextCtrl, vCHomeRectExtend, 0}}, - {3359, {wxStyledTextCtrl, lineEndRectExtend, 0}}, - {3360, {wxStyledTextCtrl, pageUpRectExtend, 0}}, - {3361, {wxStyledTextCtrl, pageDownRectExtend, 0}}, - {3362, {wxStyledTextCtrl, stutteredPageUp, 0}}, - {3363, {wxStyledTextCtrl, stutteredPageUpExtend, 0}}, - {3364, {wxStyledTextCtrl, stutteredPageDown, 0}}, - {3365, {wxStyledTextCtrl, stutteredPageDownExtend, 0}}, - {3366, {wxStyledTextCtrl, wordLeftEnd, 0}}, - {3367, {wxStyledTextCtrl, wordLeftEndExtend, 0}}, - {3368, {wxStyledTextCtrl, wordRightEnd, 0}}, - {3369, {wxStyledTextCtrl, wordRightEndExtend, 0}}, - {3370, {wxStyledTextCtrl, setWhitespaceChars, 1}}, - {3371, {wxStyledTextCtrl, setCharsDefault, 0}}, - {3372, {wxStyledTextCtrl, autoCompGetCurrent, 0}}, - {3373, {wxStyledTextCtrl, allocate, 1}}, - {3374, {wxStyledTextCtrl, findColumn, 2}}, - {3375, {wxStyledTextCtrl, getCaretSticky, 0}}, - {3376, {wxStyledTextCtrl, setCaretSticky, 1}}, - {3377, {wxStyledTextCtrl, toggleCaretSticky, 0}}, - {3378, {wxStyledTextCtrl, setPasteConvertEndings, 1}}, - {3379, {wxStyledTextCtrl, getPasteConvertEndings, 0}}, - {3380, {wxStyledTextCtrl, selectionDuplicate, 0}}, - {3381, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}}, - {3382, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}}, - {3383, {wxStyledTextCtrl, startRecord, 0}}, - {3384, {wxStyledTextCtrl, stopRecord, 0}}, - {3385, {wxStyledTextCtrl, setLexer, 1}}, - {3386, {wxStyledTextCtrl, getLexer, 0}}, - {3387, {wxStyledTextCtrl, colourise, 2}}, - {3388, {wxStyledTextCtrl, setProperty, 2}}, - {3389, {wxStyledTextCtrl, setKeyWords, 2}}, - {3390, {wxStyledTextCtrl, setLexerLanguage, 1}}, - {3391, {wxStyledTextCtrl, getProperty, 1}}, - {3392, {wxStyledTextCtrl, getStyleBitsNeeded, 0}}, - {3393, {wxStyledTextCtrl, getCurrentLine, 0}}, - {3394, {wxStyledTextCtrl, styleSetSpec, 2}}, - {3395, {wxStyledTextCtrl, styleSetFont, 2}}, - {3396, {wxStyledTextCtrl, styleSetFontAttr, 7}}, - {3397, {wxStyledTextCtrl, styleSetCharacterSet, 2}}, - {3398, {wxStyledTextCtrl, styleSetFontEncoding, 2}}, - {3399, {wxStyledTextCtrl, cmdKeyExecute, 1}}, - {3400, {wxStyledTextCtrl, setMargins, 2}}, - {3401, {wxStyledTextCtrl, getSelection, 2}}, - {3402, {wxStyledTextCtrl, pointFromPosition, 1}}, - {3403, {wxStyledTextCtrl, scrollToLine, 1}}, - {3404, {wxStyledTextCtrl, scrollToColumn, 1}}, - {3405, {wxStyledTextCtrl, setVScrollBar, 1}}, - {3406, {wxStyledTextCtrl, setHScrollBar, 1}}, - {3407, {wxStyledTextCtrl, getLastKeydownProcessed, 0}}, - {3408, {wxStyledTextCtrl, setLastKeydownProcessed, 1}}, - {3409, {wxStyledTextCtrl, saveFile, 1}}, - {3410, {wxStyledTextCtrl, loadFile, 1}}, - {3411, {wxStyledTextCtrl, doDragOver, 3}}, - {3412, {wxStyledTextCtrl, doDropText, 3}}, - {3413, {wxStyledTextCtrl, getUseAntiAliasing, 0}}, - {3414, {wxStyledTextCtrl, addTextRaw, 1}}, - {3415, {wxStyledTextCtrl, insertTextRaw, 2}}, - {3416, {wxStyledTextCtrl, getCurLineRaw, 1}}, - {3417, {wxStyledTextCtrl, getLineRaw, 1}}, - {3418, {wxStyledTextCtrl, getSelectedTextRaw, 0}}, - {3419, {wxStyledTextCtrl, getTextRangeRaw, 2}}, - {3420, {wxStyledTextCtrl, setTextRaw, 1}}, - {3421, {wxStyledTextCtrl, getTextRaw, 0}}, - {3422, {wxStyledTextCtrl, appendTextRaw, 1}}, - {3423, {wxArtProvider, getBitmap, 2}}, - {3424, {wxArtProvider, getIcon, 2}}, - {3425, {wxTreeEvent, getKeyCode, 0}}, - {3426, {wxTreeEvent, getItem, 0}}, - {3427, {wxTreeEvent, getKeyEvent, 0}}, - {3428, {wxTreeEvent, getLabel, 0}}, - {3429, {wxTreeEvent, getOldItem, 0}}, - {3430, {wxTreeEvent, getPoint, 0}}, - {3431, {wxTreeEvent, isEditCancelled, 0}}, - {3432, {wxTreeEvent, setToolTip, 1}}, - {3433, {wxNotebookEvent, getOldSelection, 0}}, - {3434, {wxNotebookEvent, getSelection, 0}}, - {3435, {wxNotebookEvent, setOldSelection, 1}}, - {3436, {wxNotebookEvent, setSelection, 1}}, - {3437, {wxFileDataObject, new, 0}}, - {3438, {wxFileDataObject, addFile, 1}}, - {3439, {wxFileDataObject, getFilenames, 0}}, - {3440, {wxFileDataObject, 'Destroy', undefined}}, - {3441, {wxTextDataObject, new, 1}}, - {3442, {wxTextDataObject, getTextLength, 0}}, - {3443, {wxTextDataObject, getText, 0}}, - {3444, {wxTextDataObject, setText, 1}}, - {3445, {wxTextDataObject, 'Destroy', undefined}}, - {3446, {wxBitmapDataObject, new_1_1, 1}}, - {3447, {wxBitmapDataObject, new_1_0, 1}}, - {3448, {wxBitmapDataObject, getBitmap, 0}}, - {3449, {wxBitmapDataObject, setBitmap, 1}}, - {3450, {wxBitmapDataObject, 'Destroy', undefined}}, - {3452, {wxClipboard, new, 0}}, - {3453, {wxClipboard, destruct, 0}}, - {3454, {wxClipboard, addData, 1}}, - {3455, {wxClipboard, clear, 0}}, - {3456, {wxClipboard, close, 0}}, - {3457, {wxClipboard, flush, 0}}, - {3458, {wxClipboard, getData, 1}}, - {3459, {wxClipboard, isOpened, 0}}, - {3460, {wxClipboard, open, 0}}, - {3461, {wxClipboard, setData, 1}}, - {3463, {wxClipboard, usePrimarySelection, 1}}, - {3464, {wxClipboard, isSupported, 1}}, - {3465, {wxClipboard, get, 0}}, - {3466, {wxSpinEvent, getPosition, 0}}, - {3467, {wxSpinEvent, setPosition, 1}}, - {3468, {wxSplitterWindow, new_0, 0}}, - {3469, {wxSplitterWindow, new_2, 2}}, - {3470, {wxSplitterWindow, destruct, 0}}, - {3471, {wxSplitterWindow, create, 2}}, - {3472, {wxSplitterWindow, getMinimumPaneSize, 0}}, - {3473, {wxSplitterWindow, getSashGravity, 0}}, - {3474, {wxSplitterWindow, getSashPosition, 0}}, - {3475, {wxSplitterWindow, getSplitMode, 0}}, - {3476, {wxSplitterWindow, getWindow1, 0}}, - {3477, {wxSplitterWindow, getWindow2, 0}}, - {3478, {wxSplitterWindow, initialize, 1}}, - {3479, {wxSplitterWindow, isSplit, 0}}, - {3480, {wxSplitterWindow, replaceWindow, 2}}, - {3481, {wxSplitterWindow, setSashGravity, 1}}, - {3482, {wxSplitterWindow, setSashPosition, 2}}, - {3483, {wxSplitterWindow, setSashSize, 1}}, - {3484, {wxSplitterWindow, setMinimumPaneSize, 1}}, - {3485, {wxSplitterWindow, setSplitMode, 1}}, - {3486, {wxSplitterWindow, splitHorizontally, 3}}, - {3487, {wxSplitterWindow, splitVertically, 3}}, - {3488, {wxSplitterWindow, unsplit, 1}}, - {3489, {wxSplitterWindow, updateSize, 0}}, - {3490, {wxSplitterEvent, getSashPosition, 0}}, - {3491, {wxSplitterEvent, getX, 0}}, - {3492, {wxSplitterEvent, getY, 0}}, - {3493, {wxSplitterEvent, getWindowBeingRemoved, 0}}, - {3494, {wxSplitterEvent, setSashPosition, 1}}, - {3495, {wxHtmlWindow, new_0, 0}}, - {3496, {wxHtmlWindow, new_2, 2}}, - {3497, {wxHtmlWindow, appendToPage, 1}}, - {3498, {wxHtmlWindow, getOpenedAnchor, 0}}, - {3499, {wxHtmlWindow, getOpenedPage, 0}}, - {3500, {wxHtmlWindow, getOpenedPageTitle, 0}}, - {3501, {wxHtmlWindow, getRelatedFrame, 0}}, - {3502, {wxHtmlWindow, historyBack, 0}}, - {3503, {wxHtmlWindow, historyCanBack, 0}}, - {3504, {wxHtmlWindow, historyCanForward, 0}}, - {3505, {wxHtmlWindow, historyClear, 0}}, - {3506, {wxHtmlWindow, historyForward, 0}}, - {3507, {wxHtmlWindow, loadFile, 1}}, - {3508, {wxHtmlWindow, loadPage, 1}}, - {3509, {wxHtmlWindow, selectAll, 0}}, - {3510, {wxHtmlWindow, selectionToText, 0}}, - {3511, {wxHtmlWindow, selectLine, 1}}, - {3512, {wxHtmlWindow, selectWord, 1}}, - {3513, {wxHtmlWindow, setBorders, 1}}, - {3514, {wxHtmlWindow, setFonts, 3}}, - {3515, {wxHtmlWindow, setPage, 1}}, - {3516, {wxHtmlWindow, setRelatedFrame, 2}}, - {3517, {wxHtmlWindow, setRelatedStatusBar, 1}}, - {3518, {wxHtmlWindow, toText, 0}}, - {3519, {wxHtmlWindow, 'Destroy', undefined}}, - {3520, {wxHtmlLinkEvent, getLinkInfo, 0}}, - {3521, {wxSystemSettings, getColour, 1}}, - {3522, {wxSystemSettings, getFont, 1}}, - {3523, {wxSystemSettings, getMetric, 2}}, - {3524, {wxSystemSettings, getScreenType, 0}}, - {3525, {wxSystemOptions, getOption, 1}}, - {3526, {wxSystemOptions, getOptionInt, 1}}, - {3527, {wxSystemOptions, hasOption, 1}}, - {3528, {wxSystemOptions, isFalse, 1}}, - {3529, {wxSystemOptions, setOption_2_1, 2}}, - {3530, {wxSystemOptions, setOption_2_0, 2}}, - {3531, {wxAuiNotebookEvent, setSelection, 1}}, - {3532, {wxAuiNotebookEvent, getSelection, 0}}, - {3533, {wxAuiNotebookEvent, setOldSelection, 1}}, - {3534, {wxAuiNotebookEvent, getOldSelection, 0}}, - {3535, {wxAuiNotebookEvent, setDragSource, 1}}, - {3536, {wxAuiNotebookEvent, getDragSource, 0}}, - {3537, {wxAuiManagerEvent, setManager, 1}}, - {3538, {wxAuiManagerEvent, getManager, 0}}, - {3539, {wxAuiManagerEvent, setPane, 1}}, - {3540, {wxAuiManagerEvent, getPane, 0}}, - {3541, {wxAuiManagerEvent, setButton, 1}}, - {3542, {wxAuiManagerEvent, getButton, 0}}, - {3543, {wxAuiManagerEvent, setDC, 1}}, - {3544, {wxAuiManagerEvent, getDC, 0}}, - {3545, {wxAuiManagerEvent, veto, 1}}, - {3546, {wxAuiManagerEvent, getVeto, 0}}, - {3547, {wxAuiManagerEvent, setCanVeto, 1}}, - {3548, {wxAuiManagerEvent, canVeto, 0}}, - {3549, {wxLogNull, new, 0}}, - {3550, {wxLogNull, 'Destroy', undefined}}, - {3551, {wxTaskBarIcon, new, 0}}, - {3552, {wxTaskBarIcon, destruct, 0}}, - {3553, {wxTaskBarIcon, popupMenu, 1}}, - {3554, {wxTaskBarIcon, removeIcon, 0}}, - {3555, {wxTaskBarIcon, setIcon, 2}}, - {3556, {wxLocale, new_0, 0}}, - {3558, {wxLocale, new_2, 2}}, - {3559, {wxLocale, destruct, 0}}, - {3561, {wxLocale, init, 1}}, - {3562, {wxLocale, addCatalog_1, 1}}, - {3563, {wxLocale, addCatalog_3, 3}}, - {3564, {wxLocale, addCatalogLookupPathPrefix, 1}}, - {3565, {wxLocale, getCanonicalName, 0}}, - {3566, {wxLocale, getLanguage, 0}}, - {3567, {wxLocale, getLanguageName, 1}}, - {3568, {wxLocale, getLocale, 0}}, - {3569, {wxLocale, getName, 0}}, - {3570, {wxLocale, getString_2, 2}}, - {3571, {wxLocale, getString_4, 4}}, - {3572, {wxLocale, getHeaderValue, 2}}, - {3573, {wxLocale, getSysName, 0}}, - {3574, {wxLocale, getSystemEncoding, 0}}, - {3575, {wxLocale, getSystemEncodingName, 0}}, - {3576, {wxLocale, getSystemLanguage, 0}}, - {3577, {wxLocale, isLoaded, 1}}, - {3578, {wxLocale, isOk, 0}}, - {3579, {wxActivateEvent, getActive, 0}}, - {3581, {wxPopupWindow, new_2, 2}}, - {3582, {wxPopupWindow, new_0, 0}}, - {3584, {wxPopupWindow, destruct, 0}}, - {3585, {wxPopupWindow, create, 2}}, - {3586, {wxPopupWindow, position, 2}}, - {3587, {wxPopupTransientWindow, new_0, 0}}, - {3588, {wxPopupTransientWindow, new_2, 2}}, - {3589, {wxPopupTransientWindow, destruct, 0}}, - {3590, {wxPopupTransientWindow, popup, 1}}, - {3591, {wxPopupTransientWindow, dismiss, 0}}, - {3592, {wxOverlay, new, 0}}, - {3593, {wxOverlay, destruct, 0}}, - {3594, {wxOverlay, reset, 0}}, - {3595, {wxDCOverlay, new_6, 6}}, - {3596, {wxDCOverlay, new_2, 2}}, - {3597, {wxDCOverlay, destruct, 0}}, - {3598, {wxDCOverlay, clear, 0}}, + {1605, {wxGauge, getRange, 0}}, + {1606, {wxGauge, getValue, 0}}, + {1607, {wxGauge, isVertical, 0}}, + {1608, {wxGauge, setRange, 1}}, + {1609, {wxGauge, setValue, 1}}, + {1610, {wxGauge, pulse, 0}}, + {1611, {wxGauge, 'Destroy', undefined}}, + {1612, {wxGenericDirCtrl, new_0, 0}}, + {1613, {wxGenericDirCtrl, new_2, 2}}, + {1614, {wxGenericDirCtrl, destruct, 0}}, + {1615, {wxGenericDirCtrl, create, 2}}, + {1616, {wxGenericDirCtrl, init, 0}}, + {1617, {wxGenericDirCtrl, collapseTree, 0}}, + {1618, {wxGenericDirCtrl, expandPath, 1}}, + {1619, {wxGenericDirCtrl, getDefaultPath, 0}}, + {1620, {wxGenericDirCtrl, getPath, 0}}, + {1621, {wxGenericDirCtrl, getFilePath, 0}}, + {1622, {wxGenericDirCtrl, getFilter, 0}}, + {1623, {wxGenericDirCtrl, getFilterIndex, 0}}, + {1624, {wxGenericDirCtrl, getRootId, 0}}, + {1625, {wxGenericDirCtrl, getTreeCtrl, 0}}, + {1626, {wxGenericDirCtrl, reCreateTree, 0}}, + {1627, {wxGenericDirCtrl, setDefaultPath, 1}}, + {1628, {wxGenericDirCtrl, setFilter, 1}}, + {1629, {wxGenericDirCtrl, setFilterIndex, 1}}, + {1630, {wxGenericDirCtrl, setPath, 1}}, + {1632, {wxStaticBox, new_4, 4}}, + {1633, {wxStaticBox, new_0, 0}}, + {1634, {wxStaticBox, create, 4}}, + {1635, {wxStaticBox, 'Destroy', undefined}}, + {1637, {wxStaticLine, new_2, 2}}, + {1638, {wxStaticLine, new_0, 0}}, + {1639, {wxStaticLine, create, 2}}, + {1640, {wxStaticLine, isVertical, 0}}, + {1641, {wxStaticLine, getDefaultSize, 0}}, + {1642, {wxStaticLine, 'Destroy', undefined}}, + {1645, {wxListBox, new_3, 3}}, + {1646, {wxListBox, new_0, 0}}, + {1648, {wxListBox, destruct, 0}}, + {1650, {wxListBox, create, 6}}, + {1651, {wxListBox, deselect, 1}}, + {1652, {wxListBox, getSelections, 1}}, + {1653, {wxListBox, insertItems, 2}}, + {1654, {wxListBox, isSelected, 1}}, + {1655, {wxListBox, set, 1}}, + {1656, {wxListBox, hitTest, 1}}, + {1657, {wxListBox, setFirstItem_1_0, 1}}, + {1658, {wxListBox, setFirstItem_1_1, 1}}, + {1659, {wxListCtrl, new_0, 0}}, + {1660, {wxListCtrl, new_2, 2}}, + {1661, {wxListCtrl, arrange, 1}}, + {1662, {wxListCtrl, assignImageList, 2}}, + {1663, {wxListCtrl, clearAll, 0}}, + {1664, {wxListCtrl, create, 2}}, + {1665, {wxListCtrl, deleteAllItems, 0}}, + {1666, {wxListCtrl, deleteColumn, 1}}, + {1667, {wxListCtrl, deleteItem, 1}}, + {1668, {wxListCtrl, editLabel, 1}}, + {1669, {wxListCtrl, ensureVisible, 1}}, + {1670, {wxListCtrl, findItem_3_0, 3}}, + {1671, {wxListCtrl, findItem_3_1, 3}}, + {1672, {wxListCtrl, getColumn, 2}}, + {1673, {wxListCtrl, getColumnCount, 0}}, + {1674, {wxListCtrl, getColumnWidth, 1}}, + {1675, {wxListCtrl, getCountPerPage, 0}}, + {1676, {wxListCtrl, getEditControl, 0}}, + {1677, {wxListCtrl, getImageList, 1}}, + {1678, {wxListCtrl, getItem, 1}}, + {1679, {wxListCtrl, getItemBackgroundColour, 1}}, + {1680, {wxListCtrl, getItemCount, 0}}, + {1681, {wxListCtrl, getItemData, 1}}, + {1682, {wxListCtrl, getItemFont, 1}}, + {1683, {wxListCtrl, getItemPosition, 2}}, + {1684, {wxListCtrl, getItemRect, 3}}, + {1685, {wxListCtrl, getItemSpacing, 0}}, + {1686, {wxListCtrl, getItemState, 2}}, + {1687, {wxListCtrl, getItemText, 1}}, + {1688, {wxListCtrl, getItemTextColour, 1}}, + {1689, {wxListCtrl, getNextItem, 2}}, + {1690, {wxListCtrl, getSelectedItemCount, 0}}, + {1691, {wxListCtrl, getTextColour, 0}}, + {1692, {wxListCtrl, getTopItem, 0}}, + {1693, {wxListCtrl, getViewRect, 0}}, + {1694, {wxListCtrl, hitTest, 3}}, + {1695, {wxListCtrl, insertColumn_2, 2}}, + {1696, {wxListCtrl, insertColumn_3, 3}}, + {1697, {wxListCtrl, insertItem_1, 1}}, + {1698, {wxListCtrl, insertItem_2_1, 2}}, + {1699, {wxListCtrl, insertItem_2_0, 2}}, + {1700, {wxListCtrl, insertItem_3, 3}}, + {1701, {wxListCtrl, refreshItem, 1}}, + {1702, {wxListCtrl, refreshItems, 2}}, + {1703, {wxListCtrl, scrollList, 2}}, + {1704, {wxListCtrl, setBackgroundColour, 1}}, + {1705, {wxListCtrl, setColumn, 2}}, + {1706, {wxListCtrl, setColumnWidth, 2}}, + {1707, {wxListCtrl, setImageList, 2}}, + {1708, {wxListCtrl, setItem_1, 1}}, + {1709, {wxListCtrl, setItem_4, 4}}, + {1710, {wxListCtrl, setItemBackgroundColour, 2}}, + {1711, {wxListCtrl, setItemCount, 1}}, + {1712, {wxListCtrl, setItemData, 2}}, + {1713, {wxListCtrl, setItemFont, 2}}, + {1714, {wxListCtrl, setItemImage, 3}}, + {1715, {wxListCtrl, setItemColumnImage, 3}}, + {1716, {wxListCtrl, setItemPosition, 2}}, + {1717, {wxListCtrl, setItemState, 3}}, + {1718, {wxListCtrl, setItemText, 2}}, + {1719, {wxListCtrl, setItemTextColour, 2}}, + {1720, {wxListCtrl, setSingleStyle, 2}}, + {1721, {wxListCtrl, setTextColour, 1}}, + {1722, {wxListCtrl, setWindowStyleFlag, 1}}, + {1723, {wxListCtrl, sortItems, 2}}, + {1724, {wxListCtrl, 'Destroy', undefined}}, + {1725, {wxListView, clearColumnImage, 1}}, + {1726, {wxListView, focus, 1}}, + {1727, {wxListView, getFirstSelected, 0}}, + {1728, {wxListView, getFocusedItem, 0}}, + {1729, {wxListView, getNextSelected, 1}}, + {1730, {wxListView, isSelected, 1}}, + {1731, {wxListView, select, 2}}, + {1732, {wxListView, setColumnImage, 2}}, + {1733, {wxListItem, new_0, 0}}, + {1734, {wxListItem, new_1, 1}}, + {1735, {wxListItem, destruct, 0}}, + {1736, {wxListItem, clear, 0}}, + {1737, {wxListItem, getAlign, 0}}, + {1738, {wxListItem, getBackgroundColour, 0}}, + {1739, {wxListItem, getColumn, 0}}, + {1740, {wxListItem, getFont, 0}}, + {1741, {wxListItem, getId, 0}}, + {1742, {wxListItem, getImage, 0}}, + {1743, {wxListItem, getMask, 0}}, + {1744, {wxListItem, getState, 0}}, + {1745, {wxListItem, getText, 0}}, + {1746, {wxListItem, getTextColour, 0}}, + {1747, {wxListItem, getWidth, 0}}, + {1748, {wxListItem, setAlign, 1}}, + {1749, {wxListItem, setBackgroundColour, 1}}, + {1750, {wxListItem, setColumn, 1}}, + {1751, {wxListItem, setFont, 1}}, + {1752, {wxListItem, setId, 1}}, + {1753, {wxListItem, setImage, 1}}, + {1754, {wxListItem, setMask, 1}}, + {1755, {wxListItem, setState, 1}}, + {1756, {wxListItem, setStateMask, 1}}, + {1757, {wxListItem, setText, 1}}, + {1758, {wxListItem, setTextColour, 1}}, + {1759, {wxListItem, setWidth, 1}}, + {1760, {wxListItemAttr, new_0, 0}}, + {1761, {wxListItemAttr, new_3, 3}}, + {1762, {wxListItemAttr, getBackgroundColour, 0}}, + {1763, {wxListItemAttr, getFont, 0}}, + {1764, {wxListItemAttr, getTextColour, 0}}, + {1765, {wxListItemAttr, hasBackgroundColour, 0}}, + {1766, {wxListItemAttr, hasFont, 0}}, + {1767, {wxListItemAttr, hasTextColour, 0}}, + {1768, {wxListItemAttr, setBackgroundColour, 1}}, + {1769, {wxListItemAttr, setFont, 1}}, + {1770, {wxListItemAttr, setTextColour, 1}}, + {1771, {wxListItemAttr, 'Destroy', undefined}}, + {1772, {wxImageList, new_0, 0}}, + {1773, {wxImageList, new_3, 3}}, + {1774, {wxImageList, add_1, 1}}, + {1775, {wxImageList, add_2_0, 2}}, + {1776, {wxImageList, add_2_1, 2}}, + {1777, {wxImageList, create, 3}}, + {1779, {wxImageList, draw, 5}}, + {1780, {wxImageList, getBitmap, 1}}, + {1781, {wxImageList, getIcon, 1}}, + {1782, {wxImageList, getImageCount, 0}}, + {1783, {wxImageList, getSize, 3}}, + {1784, {wxImageList, remove, 1}}, + {1785, {wxImageList, removeAll, 0}}, + {1786, {wxImageList, replace_2, 2}}, + {1787, {wxImageList, replace_3, 3}}, + {1788, {wxImageList, 'Destroy', undefined}}, + {1789, {wxTextAttr, new_0, 0}}, + {1790, {wxTextAttr, new_2, 2}}, + {1791, {wxTextAttr, getAlignment, 0}}, + {1792, {wxTextAttr, getBackgroundColour, 0}}, + {1793, {wxTextAttr, getFont, 0}}, + {1794, {wxTextAttr, getLeftIndent, 0}}, + {1795, {wxTextAttr, getLeftSubIndent, 0}}, + {1796, {wxTextAttr, getRightIndent, 0}}, + {1797, {wxTextAttr, getTabs, 0}}, + {1798, {wxTextAttr, getTextColour, 0}}, + {1799, {wxTextAttr, hasBackgroundColour, 0}}, + {1800, {wxTextAttr, hasFont, 0}}, + {1801, {wxTextAttr, hasTextColour, 0}}, + {1802, {wxTextAttr, getFlags, 0}}, + {1803, {wxTextAttr, isDefault, 0}}, + {1804, {wxTextAttr, setAlignment, 1}}, + {1805, {wxTextAttr, setBackgroundColour, 1}}, + {1806, {wxTextAttr, setFlags, 1}}, + {1807, {wxTextAttr, setFont, 2}}, + {1808, {wxTextAttr, setLeftIndent, 2}}, + {1809, {wxTextAttr, setRightIndent, 1}}, + {1810, {wxTextAttr, setTabs, 1}}, + {1811, {wxTextAttr, setTextColour, 1}}, + {1812, {wxTextAttr, 'Destroy', undefined}}, + {1814, {wxTextCtrl, new_3, 3}}, + {1815, {wxTextCtrl, new_0, 0}}, + {1817, {wxTextCtrl, destruct, 0}}, + {1818, {wxTextCtrl, appendText, 1}}, + {1819, {wxTextCtrl, canCopy, 0}}, + {1820, {wxTextCtrl, canCut, 0}}, + {1821, {wxTextCtrl, canPaste, 0}}, + {1822, {wxTextCtrl, canRedo, 0}}, + {1823, {wxTextCtrl, canUndo, 0}}, + {1824, {wxTextCtrl, clear, 0}}, + {1825, {wxTextCtrl, copy, 0}}, + {1826, {wxTextCtrl, create, 3}}, + {1827, {wxTextCtrl, cut, 0}}, + {1828, {wxTextCtrl, discardEdits, 0}}, + {1829, {wxTextCtrl, changeValue, 1}}, + {1830, {wxTextCtrl, emulateKeyPress, 1}}, + {1831, {wxTextCtrl, getDefaultStyle, 0}}, + {1832, {wxTextCtrl, getInsertionPoint, 0}}, + {1833, {wxTextCtrl, getLastPosition, 0}}, + {1834, {wxTextCtrl, getLineLength, 1}}, + {1835, {wxTextCtrl, getLineText, 1}}, + {1836, {wxTextCtrl, getNumberOfLines, 0}}, + {1837, {wxTextCtrl, getRange, 2}}, + {1838, {wxTextCtrl, getSelection, 2}}, + {1839, {wxTextCtrl, getStringSelection, 0}}, + {1840, {wxTextCtrl, getStyle, 2}}, + {1841, {wxTextCtrl, getValue, 0}}, + {1842, {wxTextCtrl, isEditable, 0}}, + {1843, {wxTextCtrl, isModified, 0}}, + {1844, {wxTextCtrl, isMultiLine, 0}}, + {1845, {wxTextCtrl, isSingleLine, 0}}, + {1846, {wxTextCtrl, loadFile, 2}}, + {1847, {wxTextCtrl, markDirty, 0}}, + {1848, {wxTextCtrl, paste, 0}}, + {1849, {wxTextCtrl, positionToXY, 3}}, + {1850, {wxTextCtrl, redo, 0}}, + {1851, {wxTextCtrl, remove, 2}}, + {1852, {wxTextCtrl, replace, 3}}, + {1853, {wxTextCtrl, saveFile, 1}}, + {1854, {wxTextCtrl, setDefaultStyle, 1}}, + {1855, {wxTextCtrl, setEditable, 1}}, + {1856, {wxTextCtrl, setInsertionPoint, 1}}, + {1857, {wxTextCtrl, setInsertionPointEnd, 0}}, + {1859, {wxTextCtrl, setMaxLength, 1}}, + {1860, {wxTextCtrl, setSelection, 2}}, + {1861, {wxTextCtrl, setStyle, 3}}, + {1862, {wxTextCtrl, setValue, 1}}, + {1863, {wxTextCtrl, showPosition, 1}}, + {1864, {wxTextCtrl, undo, 0}}, + {1865, {wxTextCtrl, writeText, 1}}, + {1866, {wxTextCtrl, xYToPosition, 2}}, + {1869, {wxNotebook, new_0, 0}}, + {1870, {wxNotebook, new_3, 3}}, + {1871, {wxNotebook, destruct, 0}}, + {1872, {wxNotebook, addPage, 3}}, + {1873, {wxNotebook, advanceSelection, 1}}, + {1874, {wxNotebook, assignImageList, 1}}, + {1875, {wxNotebook, create, 3}}, + {1876, {wxNotebook, deleteAllPages, 0}}, + {1877, {wxNotebook, deletePage, 1}}, + {1878, {wxNotebook, removePage, 1}}, + {1879, {wxNotebook, getCurrentPage, 0}}, + {1880, {wxNotebook, getImageList, 0}}, + {1882, {wxNotebook, getPage, 1}}, + {1883, {wxNotebook, getPageCount, 0}}, + {1884, {wxNotebook, getPageImage, 1}}, + {1885, {wxNotebook, getPageText, 1}}, + {1886, {wxNotebook, getRowCount, 0}}, + {1887, {wxNotebook, getSelection, 0}}, + {1888, {wxNotebook, getThemeBackgroundColour, 0}}, + {1890, {wxNotebook, hitTest, 2}}, + {1892, {wxNotebook, insertPage, 4}}, + {1893, {wxNotebook, setImageList, 1}}, + {1894, {wxNotebook, setPadding, 1}}, + {1895, {wxNotebook, setPageSize, 1}}, + {1896, {wxNotebook, setPageImage, 2}}, + {1897, {wxNotebook, setPageText, 2}}, + {1898, {wxNotebook, setSelection, 1}}, + {1899, {wxNotebook, changeSelection, 1}}, + {1900, {wxChoicebook, new_0, 0}}, + {1901, {wxChoicebook, new_3, 3}}, + {1902, {wxChoicebook, addPage, 3}}, + {1903, {wxChoicebook, advanceSelection, 1}}, + {1904, {wxChoicebook, assignImageList, 1}}, + {1905, {wxChoicebook, create, 3}}, + {1906, {wxChoicebook, deleteAllPages, 0}}, + {1907, {wxChoicebook, deletePage, 1}}, + {1908, {wxChoicebook, removePage, 1}}, + {1909, {wxChoicebook, getCurrentPage, 0}}, + {1910, {wxChoicebook, getImageList, 0}}, + {1912, {wxChoicebook, getPage, 1}}, + {1913, {wxChoicebook, getPageCount, 0}}, + {1914, {wxChoicebook, getPageImage, 1}}, + {1915, {wxChoicebook, getPageText, 1}}, + {1916, {wxChoicebook, getSelection, 0}}, + {1917, {wxChoicebook, hitTest, 2}}, + {1918, {wxChoicebook, insertPage, 4}}, + {1919, {wxChoicebook, setImageList, 1}}, + {1920, {wxChoicebook, setPageSize, 1}}, + {1921, {wxChoicebook, setPageImage, 2}}, + {1922, {wxChoicebook, setPageText, 2}}, + {1923, {wxChoicebook, setSelection, 1}}, + {1924, {wxChoicebook, changeSelection, 1}}, + {1925, {wxChoicebook, 'Destroy', undefined}}, + {1926, {wxToolbook, new_0, 0}}, + {1927, {wxToolbook, new_3, 3}}, + {1928, {wxToolbook, addPage, 3}}, + {1929, {wxToolbook, advanceSelection, 1}}, + {1930, {wxToolbook, assignImageList, 1}}, + {1931, {wxToolbook, create, 3}}, + {1932, {wxToolbook, deleteAllPages, 0}}, + {1933, {wxToolbook, deletePage, 1}}, + {1934, {wxToolbook, removePage, 1}}, + {1935, {wxToolbook, getCurrentPage, 0}}, + {1936, {wxToolbook, getImageList, 0}}, + {1938, {wxToolbook, getPage, 1}}, + {1939, {wxToolbook, getPageCount, 0}}, + {1940, {wxToolbook, getPageImage, 1}}, + {1941, {wxToolbook, getPageText, 1}}, + {1942, {wxToolbook, getSelection, 0}}, + {1944, {wxToolbook, hitTest, 2}}, + {1945, {wxToolbook, insertPage, 4}}, + {1946, {wxToolbook, setImageList, 1}}, + {1947, {wxToolbook, setPageSize, 1}}, + {1948, {wxToolbook, setPageImage, 2}}, + {1949, {wxToolbook, setPageText, 2}}, + {1950, {wxToolbook, setSelection, 1}}, + {1951, {wxToolbook, changeSelection, 1}}, + {1952, {wxToolbook, 'Destroy', undefined}}, + {1953, {wxListbook, new_0, 0}}, + {1954, {wxListbook, new_3, 3}}, + {1955, {wxListbook, addPage, 3}}, + {1956, {wxListbook, advanceSelection, 1}}, + {1957, {wxListbook, assignImageList, 1}}, + {1958, {wxListbook, create, 3}}, + {1959, {wxListbook, deleteAllPages, 0}}, + {1960, {wxListbook, deletePage, 1}}, + {1961, {wxListbook, removePage, 1}}, + {1962, {wxListbook, getCurrentPage, 0}}, + {1963, {wxListbook, getImageList, 0}}, + {1965, {wxListbook, getPage, 1}}, + {1966, {wxListbook, getPageCount, 0}}, + {1967, {wxListbook, getPageImage, 1}}, + {1968, {wxListbook, getPageText, 1}}, + {1969, {wxListbook, getSelection, 0}}, + {1971, {wxListbook, hitTest, 2}}, + {1972, {wxListbook, insertPage, 4}}, + {1973, {wxListbook, setImageList, 1}}, + {1974, {wxListbook, setPageSize, 1}}, + {1975, {wxListbook, setPageImage, 2}}, + {1976, {wxListbook, setPageText, 2}}, + {1977, {wxListbook, setSelection, 1}}, + {1978, {wxListbook, changeSelection, 1}}, + {1979, {wxListbook, 'Destroy', undefined}}, + {1980, {wxTreebook, new_0, 0}}, + {1981, {wxTreebook, new_3, 3}}, + {1982, {wxTreebook, addPage, 3}}, + {1983, {wxTreebook, advanceSelection, 1}}, + {1984, {wxTreebook, assignImageList, 1}}, + {1985, {wxTreebook, create, 3}}, + {1986, {wxTreebook, deleteAllPages, 0}}, + {1987, {wxTreebook, deletePage, 1}}, + {1988, {wxTreebook, removePage, 1}}, + {1989, {wxTreebook, getCurrentPage, 0}}, + {1990, {wxTreebook, getImageList, 0}}, + {1992, {wxTreebook, getPage, 1}}, + {1993, {wxTreebook, getPageCount, 0}}, + {1994, {wxTreebook, getPageImage, 1}}, + {1995, {wxTreebook, getPageText, 1}}, + {1996, {wxTreebook, getSelection, 0}}, + {1997, {wxTreebook, expandNode, 2}}, + {1998, {wxTreebook, isNodeExpanded, 1}}, + {2000, {wxTreebook, hitTest, 2}}, + {2001, {wxTreebook, insertPage, 4}}, + {2002, {wxTreebook, insertSubPage, 4}}, + {2003, {wxTreebook, setImageList, 1}}, + {2004, {wxTreebook, setPageSize, 1}}, + {2005, {wxTreebook, setPageImage, 2}}, + {2006, {wxTreebook, setPageText, 2}}, + {2007, {wxTreebook, setSelection, 1}}, + {2008, {wxTreebook, changeSelection, 1}}, + {2009, {wxTreebook, 'Destroy', undefined}}, + {2012, {wxTreeCtrl, new_2, 2}}, + {2013, {wxTreeCtrl, new_0, 0}}, + {2015, {wxTreeCtrl, destruct, 0}}, + {2016, {wxTreeCtrl, addRoot, 2}}, + {2017, {wxTreeCtrl, appendItem, 3}}, + {2018, {wxTreeCtrl, assignImageList, 1}}, + {2019, {wxTreeCtrl, assignStateImageList, 1}}, + {2020, {wxTreeCtrl, collapse, 1}}, + {2021, {wxTreeCtrl, collapseAndReset, 1}}, + {2022, {wxTreeCtrl, create, 2}}, + {2023, {wxTreeCtrl, delete, 1}}, + {2024, {wxTreeCtrl, deleteAllItems, 0}}, + {2025, {wxTreeCtrl, deleteChildren, 1}}, + {2026, {wxTreeCtrl, editLabel, 1}}, + {2027, {wxTreeCtrl, ensureVisible, 1}}, + {2028, {wxTreeCtrl, expand, 1}}, + {2029, {wxTreeCtrl, getBoundingRect, 3}}, + {2031, {wxTreeCtrl, getChildrenCount, 2}}, + {2032, {wxTreeCtrl, getCount, 0}}, + {2033, {wxTreeCtrl, getEditControl, 0}}, + {2034, {wxTreeCtrl, getFirstChild, 2}}, + {2035, {wxTreeCtrl, getNextChild, 2}}, + {2036, {wxTreeCtrl, getFirstVisibleItem, 0}}, + {2037, {wxTreeCtrl, getImageList, 0}}, + {2038, {wxTreeCtrl, getIndent, 0}}, + {2039, {wxTreeCtrl, getItemBackgroundColour, 1}}, + {2040, {wxTreeCtrl, getItemData, 1}}, + {2041, {wxTreeCtrl, getItemFont, 1}}, + {2042, {wxTreeCtrl, getItemImage_1, 1}}, + {2043, {wxTreeCtrl, getItemImage_2, 2}}, + {2044, {wxTreeCtrl, getItemText, 1}}, + {2045, {wxTreeCtrl, getItemTextColour, 1}}, + {2046, {wxTreeCtrl, getLastChild, 1}}, + {2047, {wxTreeCtrl, getNextSibling, 1}}, + {2048, {wxTreeCtrl, getNextVisible, 1}}, + {2049, {wxTreeCtrl, getItemParent, 1}}, + {2050, {wxTreeCtrl, getPrevSibling, 1}}, + {2051, {wxTreeCtrl, getPrevVisible, 1}}, + {2052, {wxTreeCtrl, getRootItem, 0}}, + {2053, {wxTreeCtrl, getSelection, 0}}, + {2054, {wxTreeCtrl, getSelections, 1}}, + {2055, {wxTreeCtrl, getStateImageList, 0}}, + {2056, {wxTreeCtrl, hitTest, 2}}, + {2058, {wxTreeCtrl, insertItem, 4}}, + {2059, {wxTreeCtrl, isBold, 1}}, + {2060, {wxTreeCtrl, isExpanded, 1}}, + {2061, {wxTreeCtrl, isSelected, 1}}, + {2062, {wxTreeCtrl, isVisible, 1}}, + {2063, {wxTreeCtrl, itemHasChildren, 1}}, + {2064, {wxTreeCtrl, isTreeItemIdOk, 1}}, + {2065, {wxTreeCtrl, prependItem, 3}}, + {2066, {wxTreeCtrl, scrollTo, 1}}, + {2067, {wxTreeCtrl, selectItem_1, 1}}, + {2068, {wxTreeCtrl, selectItem_2, 2}}, + {2069, {wxTreeCtrl, setIndent, 1}}, + {2070, {wxTreeCtrl, setImageList, 1}}, + {2071, {wxTreeCtrl, setItemBackgroundColour, 2}}, + {2072, {wxTreeCtrl, setItemBold, 2}}, + {2073, {wxTreeCtrl, setItemData, 2}}, + {2074, {wxTreeCtrl, setItemDropHighlight, 2}}, + {2075, {wxTreeCtrl, setItemFont, 2}}, + {2076, {wxTreeCtrl, setItemHasChildren, 2}}, + {2077, {wxTreeCtrl, setItemImage_2, 2}}, + {2078, {wxTreeCtrl, setItemImage_3, 3}}, + {2079, {wxTreeCtrl, setItemText, 2}}, + {2080, {wxTreeCtrl, setItemTextColour, 2}}, + {2081, {wxTreeCtrl, setStateImageList, 1}}, + {2082, {wxTreeCtrl, setWindowStyle, 1}}, + {2083, {wxTreeCtrl, sortChildren, 1}}, + {2084, {wxTreeCtrl, toggle, 1}}, + {2085, {wxTreeCtrl, toggleItemSelection, 1}}, + {2086, {wxTreeCtrl, unselect, 0}}, + {2087, {wxTreeCtrl, unselectAll, 0}}, + {2088, {wxTreeCtrl, unselectItem, 1}}, + {2089, {wxScrollBar, new_0, 0}}, + {2090, {wxScrollBar, new_3, 3}}, + {2091, {wxScrollBar, destruct, 0}}, + {2092, {wxScrollBar, create, 3}}, + {2093, {wxScrollBar, getRange, 0}}, + {2094, {wxScrollBar, getPageSize, 0}}, + {2095, {wxScrollBar, getThumbPosition, 0}}, + {2096, {wxScrollBar, getThumbSize, 0}}, + {2097, {wxScrollBar, setThumbPosition, 1}}, + {2098, {wxScrollBar, setScrollbar, 5}}, + {2100, {wxSpinButton, new_2, 2}}, + {2101, {wxSpinButton, new_0, 0}}, + {2102, {wxSpinButton, create, 2}}, + {2103, {wxSpinButton, getMax, 0}}, + {2104, {wxSpinButton, getMin, 0}}, + {2105, {wxSpinButton, getValue, 0}}, + {2106, {wxSpinButton, setRange, 2}}, + {2107, {wxSpinButton, setValue, 1}}, + {2108, {wxSpinButton, 'Destroy', undefined}}, + {2109, {wxSpinCtrl, new_0, 0}}, + {2110, {wxSpinCtrl, new_2, 2}}, + {2112, {wxSpinCtrl, create, 2}}, + {2115, {wxSpinCtrl, setValue_1_1, 1}}, + {2116, {wxSpinCtrl, setValue_1_0, 1}}, + {2118, {wxSpinCtrl, getValue, 0}}, + {2120, {wxSpinCtrl, setRange, 2}}, + {2121, {wxSpinCtrl, setSelection, 2}}, + {2123, {wxSpinCtrl, getMin, 0}}, + {2125, {wxSpinCtrl, getMax, 0}}, + {2126, {wxSpinCtrl, 'Destroy', undefined}}, + {2127, {wxStaticText, new_0, 0}}, + {2128, {wxStaticText, new_4, 4}}, + {2129, {wxStaticText, create, 4}}, + {2130, {wxStaticText, getLabel, 0}}, + {2131, {wxStaticText, setLabel, 1}}, + {2132, {wxStaticText, wrap, 1}}, + {2133, {wxStaticText, 'Destroy', undefined}}, + {2134, {wxStaticBitmap, new_0, 0}}, + {2135, {wxStaticBitmap, new_4, 4}}, + {2136, {wxStaticBitmap, create, 4}}, + {2137, {wxStaticBitmap, getBitmap, 0}}, + {2138, {wxStaticBitmap, setBitmap, 1}}, + {2139, {wxStaticBitmap, 'Destroy', undefined}}, + {2140, {wxRadioBox, new, 7}}, + {2142, {wxRadioBox, destruct, 0}}, + {2143, {wxRadioBox, create, 7}}, + {2144, {wxRadioBox, enable_2, 2}}, + {2145, {wxRadioBox, enable_1, 1}}, + {2146, {wxRadioBox, getSelection, 0}}, + {2147, {wxRadioBox, getString, 1}}, + {2148, {wxRadioBox, setSelection, 1}}, + {2149, {wxRadioBox, show_2, 2}}, + {2150, {wxRadioBox, show_1, 1}}, + {2151, {wxRadioBox, getColumnCount, 0}}, + {2152, {wxRadioBox, getItemHelpText, 1}}, + {2153, {wxRadioBox, getItemToolTip, 1}}, + {2155, {wxRadioBox, getItemFromPoint, 1}}, + {2156, {wxRadioBox, getRowCount, 0}}, + {2157, {wxRadioBox, isItemEnabled, 1}}, + {2158, {wxRadioBox, isItemShown, 1}}, + {2159, {wxRadioBox, setItemHelpText, 2}}, + {2160, {wxRadioBox, setItemToolTip, 2}}, + {2161, {wxRadioButton, new_0, 0}}, + {2162, {wxRadioButton, new_4, 4}}, + {2163, {wxRadioButton, create, 4}}, + {2164, {wxRadioButton, getValue, 0}}, + {2165, {wxRadioButton, setValue, 1}}, + {2166, {wxRadioButton, 'Destroy', undefined}}, + {2168, {wxSlider, new_6, 6}}, + {2169, {wxSlider, new_0, 0}}, + {2170, {wxSlider, create, 6}}, + {2171, {wxSlider, getLineSize, 0}}, + {2172, {wxSlider, getMax, 0}}, + {2173, {wxSlider, getMin, 0}}, + {2174, {wxSlider, getPageSize, 0}}, + {2175, {wxSlider, getThumbLength, 0}}, + {2176, {wxSlider, getValue, 0}}, + {2177, {wxSlider, setLineSize, 1}}, + {2178, {wxSlider, setPageSize, 1}}, + {2179, {wxSlider, setRange, 2}}, + {2180, {wxSlider, setThumbLength, 1}}, + {2181, {wxSlider, setValue, 1}}, + {2182, {wxSlider, 'Destroy', undefined}}, + {2184, {wxDialog, new_4, 4}}, + {2185, {wxDialog, new_0, 0}}, + {2187, {wxDialog, destruct, 0}}, + {2188, {wxDialog, create, 4}}, + {2189, {wxDialog, createButtonSizer, 1}}, + {2190, {wxDialog, createStdDialogButtonSizer, 1}}, + {2191, {wxDialog, endModal, 1}}, + {2192, {wxDialog, getAffirmativeId, 0}}, + {2193, {wxDialog, getReturnCode, 0}}, + {2194, {wxDialog, isModal, 0}}, + {2195, {wxDialog, setAffirmativeId, 1}}, + {2196, {wxDialog, setReturnCode, 1}}, + {2197, {wxDialog, show, 1}}, + {2198, {wxDialog, showModal, 0}}, + {2199, {wxColourDialog, new_0, 0}}, + {2200, {wxColourDialog, new_2, 2}}, + {2201, {wxColourDialog, destruct, 0}}, + {2202, {wxColourDialog, create, 2}}, + {2203, {wxColourDialog, getColourData, 0}}, + {2204, {wxColourData, new_0, 0}}, + {2205, {wxColourData, new_1, 1}}, + {2206, {wxColourData, destruct, 0}}, + {2207, {wxColourData, getChooseFull, 0}}, + {2208, {wxColourData, getColour, 0}}, + {2210, {wxColourData, getCustomColour, 1}}, + {2211, {wxColourData, setChooseFull, 1}}, + {2212, {wxColourData, setColour, 1}}, + {2213, {wxColourData, setCustomColour, 2}}, + {2214, {wxPalette, new_0, 0}}, + {2215, {wxPalette, new_4, 4}}, + {2217, {wxPalette, destruct, 0}}, + {2218, {wxPalette, create, 4}}, + {2219, {wxPalette, getColoursCount, 0}}, + {2220, {wxPalette, getPixel, 3}}, + {2221, {wxPalette, getRGB, 4}}, + {2222, {wxPalette, isOk, 0}}, + {2226, {wxDirDialog, new, 2}}, + {2227, {wxDirDialog, destruct, 0}}, + {2228, {wxDirDialog, getPath, 0}}, + {2229, {wxDirDialog, getMessage, 0}}, + {2230, {wxDirDialog, setMessage, 1}}, + {2231, {wxDirDialog, setPath, 1}}, + {2235, {wxFileDialog, new, 2}}, + {2236, {wxFileDialog, destruct, 0}}, + {2237, {wxFileDialog, getDirectory, 0}}, + {2238, {wxFileDialog, getFilename, 0}}, + {2239, {wxFileDialog, getFilenames, 1}}, + {2240, {wxFileDialog, getFilterIndex, 0}}, + {2241, {wxFileDialog, getMessage, 0}}, + {2242, {wxFileDialog, getPath, 0}}, + {2243, {wxFileDialog, getPaths, 1}}, + {2244, {wxFileDialog, getWildcard, 0}}, + {2245, {wxFileDialog, setDirectory, 1}}, + {2246, {wxFileDialog, setFilename, 1}}, + {2247, {wxFileDialog, setFilterIndex, 1}}, + {2248, {wxFileDialog, setMessage, 1}}, + {2249, {wxFileDialog, setPath, 1}}, + {2250, {wxFileDialog, setWildcard, 1}}, + {2251, {wxPickerBase, setInternalMargin, 1}}, + {2252, {wxPickerBase, getInternalMargin, 0}}, + {2253, {wxPickerBase, setTextCtrlProportion, 1}}, + {2254, {wxPickerBase, setPickerCtrlProportion, 1}}, + {2255, {wxPickerBase, getTextCtrlProportion, 0}}, + {2256, {wxPickerBase, getPickerCtrlProportion, 0}}, + {2257, {wxPickerBase, hasTextCtrl, 0}}, + {2258, {wxPickerBase, getTextCtrl, 0}}, + {2259, {wxPickerBase, isTextCtrlGrowable, 0}}, + {2260, {wxPickerBase, setPickerCtrlGrowable, 1}}, + {2261, {wxPickerBase, setTextCtrlGrowable, 1}}, + {2262, {wxPickerBase, isPickerCtrlGrowable, 0}}, + {2263, {wxFilePickerCtrl, new_0, 0}}, + {2264, {wxFilePickerCtrl, new_3, 3}}, + {2265, {wxFilePickerCtrl, create, 3}}, + {2266, {wxFilePickerCtrl, getPath, 0}}, + {2267, {wxFilePickerCtrl, setPath, 1}}, + {2268, {wxFilePickerCtrl, 'Destroy', undefined}}, + {2269, {wxDirPickerCtrl, new_0, 0}}, + {2270, {wxDirPickerCtrl, new_3, 3}}, + {2271, {wxDirPickerCtrl, create, 3}}, + {2272, {wxDirPickerCtrl, getPath, 0}}, + {2273, {wxDirPickerCtrl, setPath, 1}}, + {2274, {wxDirPickerCtrl, 'Destroy', undefined}}, + {2275, {wxColourPickerCtrl, new_0, 0}}, + {2276, {wxColourPickerCtrl, new_3, 3}}, + {2277, {wxColourPickerCtrl, create, 3}}, + {2278, {wxColourPickerCtrl, getColour, 0}}, + {2279, {wxColourPickerCtrl, setColour_1_1, 1}}, + {2280, {wxColourPickerCtrl, setColour_1_0, 1}}, + {2281, {wxColourPickerCtrl, 'Destroy', undefined}}, + {2282, {wxDatePickerCtrl, new_0, 0}}, + {2283, {wxDatePickerCtrl, new_3, 3}}, + {2284, {wxDatePickerCtrl, getRange, 2}}, + {2285, {wxDatePickerCtrl, getValue, 0}}, + {2286, {wxDatePickerCtrl, setRange, 2}}, + {2287, {wxDatePickerCtrl, setValue, 1}}, + {2288, {wxDatePickerCtrl, 'Destroy', undefined}}, + {2289, {wxFontPickerCtrl, new_0, 0}}, + {2290, {wxFontPickerCtrl, new_3, 3}}, + {2291, {wxFontPickerCtrl, create, 3}}, + {2292, {wxFontPickerCtrl, getSelectedFont, 0}}, + {2293, {wxFontPickerCtrl, setSelectedFont, 1}}, + {2294, {wxFontPickerCtrl, getMaxPointSize, 0}}, + {2295, {wxFontPickerCtrl, setMaxPointSize, 1}}, + {2296, {wxFontPickerCtrl, 'Destroy', undefined}}, + {2299, {wxFindReplaceDialog, new_0, 0}}, + {2300, {wxFindReplaceDialog, new_4, 4}}, + {2301, {wxFindReplaceDialog, destruct, 0}}, + {2302, {wxFindReplaceDialog, create, 4}}, + {2303, {wxFindReplaceDialog, getData, 0}}, + {2304, {wxFindReplaceData, new_0, 0}}, + {2305, {wxFindReplaceData, new_1, 1}}, + {2306, {wxFindReplaceData, getFindString, 0}}, + {2307, {wxFindReplaceData, getReplaceString, 0}}, + {2308, {wxFindReplaceData, getFlags, 0}}, + {2309, {wxFindReplaceData, setFlags, 1}}, + {2310, {wxFindReplaceData, setFindString, 1}}, + {2311, {wxFindReplaceData, setReplaceString, 1}}, + {2312, {wxFindReplaceData, 'Destroy', undefined}}, + {2313, {wxMultiChoiceDialog, new_0, 0}}, + {2315, {wxMultiChoiceDialog, new_5, 5}}, + {2316, {wxMultiChoiceDialog, getSelections, 0}}, + {2317, {wxMultiChoiceDialog, setSelections, 1}}, + {2318, {wxMultiChoiceDialog, 'Destroy', undefined}}, + {2319, {wxSingleChoiceDialog, new_0, 0}}, + {2321, {wxSingleChoiceDialog, new_5, 5}}, + {2322, {wxSingleChoiceDialog, getSelection, 0}}, + {2323, {wxSingleChoiceDialog, getStringSelection, 0}}, + {2324, {wxSingleChoiceDialog, setSelection, 1}}, + {2325, {wxSingleChoiceDialog, 'Destroy', undefined}}, + {2326, {wxTextEntryDialog, new, 3}}, + {2327, {wxTextEntryDialog, getValue, 0}}, + {2328, {wxTextEntryDialog, setValue, 1}}, + {2329, {wxTextEntryDialog, 'Destroy', undefined}}, + {2330, {wxPasswordEntryDialog, new, 3}}, + {2331, {wxPasswordEntryDialog, 'Destroy', undefined}}, + {2332, {wxFontData, new_0, 0}}, + {2333, {wxFontData, new_1, 1}}, + {2334, {wxFontData, destruct, 0}}, + {2335, {wxFontData, enableEffects, 1}}, + {2336, {wxFontData, getAllowSymbols, 0}}, + {2337, {wxFontData, getColour, 0}}, + {2338, {wxFontData, getChosenFont, 0}}, + {2339, {wxFontData, getEnableEffects, 0}}, + {2340, {wxFontData, getInitialFont, 0}}, + {2341, {wxFontData, getShowHelp, 0}}, + {2342, {wxFontData, setAllowSymbols, 1}}, + {2343, {wxFontData, setChosenFont, 1}}, + {2344, {wxFontData, setColour, 1}}, + {2345, {wxFontData, setInitialFont, 1}}, + {2346, {wxFontData, setRange, 2}}, + {2347, {wxFontData, setShowHelp, 1}}, + {2351, {wxFontDialog, new_0, 0}}, + {2353, {wxFontDialog, new_2, 2}}, + {2355, {wxFontDialog, create, 2}}, + {2356, {wxFontDialog, getFontData, 0}}, + {2358, {wxFontDialog, 'Destroy', undefined}}, + {2359, {wxProgressDialog, new, 3}}, + {2360, {wxProgressDialog, destruct, 0}}, + {2361, {wxProgressDialog, resume, 0}}, + {2362, {wxProgressDialog, update_2, 2}}, + {2363, {wxProgressDialog, update_0, 0}}, + {2364, {wxMessageDialog, new, 3}}, + {2365, {wxMessageDialog, destruct, 0}}, + {2366, {wxPageSetupDialog, new, 2}}, + {2367, {wxPageSetupDialog, destruct, 0}}, + {2368, {wxPageSetupDialog, getPageSetupData, 0}}, + {2369, {wxPageSetupDialog, showModal, 0}}, + {2370, {wxPageSetupDialogData, new_0, 0}}, + {2371, {wxPageSetupDialogData, new_1_0, 1}}, + {2372, {wxPageSetupDialogData, new_1_1, 1}}, + {2373, {wxPageSetupDialogData, destruct, 0}}, + {2374, {wxPageSetupDialogData, enableHelp, 1}}, + {2375, {wxPageSetupDialogData, enableMargins, 1}}, + {2376, {wxPageSetupDialogData, enableOrientation, 1}}, + {2377, {wxPageSetupDialogData, enablePaper, 1}}, + {2378, {wxPageSetupDialogData, enablePrinter, 1}}, + {2379, {wxPageSetupDialogData, getDefaultMinMargins, 0}}, + {2380, {wxPageSetupDialogData, getEnableMargins, 0}}, + {2381, {wxPageSetupDialogData, getEnableOrientation, 0}}, + {2382, {wxPageSetupDialogData, getEnablePaper, 0}}, + {2383, {wxPageSetupDialogData, getEnablePrinter, 0}}, + {2384, {wxPageSetupDialogData, getEnableHelp, 0}}, + {2385, {wxPageSetupDialogData, getDefaultInfo, 0}}, + {2386, {wxPageSetupDialogData, getMarginTopLeft, 0}}, + {2387, {wxPageSetupDialogData, getMarginBottomRight, 0}}, + {2388, {wxPageSetupDialogData, getMinMarginTopLeft, 0}}, + {2389, {wxPageSetupDialogData, getMinMarginBottomRight, 0}}, + {2390, {wxPageSetupDialogData, getPaperId, 0}}, + {2391, {wxPageSetupDialogData, getPaperSize, 0}}, + {2393, {wxPageSetupDialogData, getPrintData, 0}}, + {2394, {wxPageSetupDialogData, isOk, 0}}, + {2395, {wxPageSetupDialogData, setDefaultInfo, 1}}, + {2396, {wxPageSetupDialogData, setDefaultMinMargins, 1}}, + {2397, {wxPageSetupDialogData, setMarginTopLeft, 1}}, + {2398, {wxPageSetupDialogData, setMarginBottomRight, 1}}, + {2399, {wxPageSetupDialogData, setMinMarginTopLeft, 1}}, + {2400, {wxPageSetupDialogData, setMinMarginBottomRight, 1}}, + {2401, {wxPageSetupDialogData, setPaperId, 1}}, + {2402, {wxPageSetupDialogData, setPaperSize_1_1, 1}}, + {2403, {wxPageSetupDialogData, setPaperSize_1_0, 1}}, + {2404, {wxPageSetupDialogData, setPrintData, 1}}, + {2405, {wxPrintDialog, new_2_0, 2}}, + {2406, {wxPrintDialog, new_2_1, 2}}, + {2407, {wxPrintDialog, destruct, 0}}, + {2408, {wxPrintDialog, getPrintDialogData, 0}}, + {2409, {wxPrintDialog, getPrintDC, 0}}, + {2410, {wxPrintDialogData, new_0, 0}}, + {2411, {wxPrintDialogData, new_1_1, 1}}, + {2412, {wxPrintDialogData, new_1_0, 1}}, + {2413, {wxPrintDialogData, destruct, 0}}, + {2414, {wxPrintDialogData, enableHelp, 1}}, + {2415, {wxPrintDialogData, enablePageNumbers, 1}}, + {2416, {wxPrintDialogData, enablePrintToFile, 1}}, + {2417, {wxPrintDialogData, enableSelection, 1}}, + {2418, {wxPrintDialogData, getAllPages, 0}}, + {2419, {wxPrintDialogData, getCollate, 0}}, + {2420, {wxPrintDialogData, getFromPage, 0}}, + {2421, {wxPrintDialogData, getMaxPage, 0}}, + {2422, {wxPrintDialogData, getMinPage, 0}}, + {2423, {wxPrintDialogData, getNoCopies, 0}}, + {2424, {wxPrintDialogData, getPrintData, 0}}, + {2425, {wxPrintDialogData, getPrintToFile, 0}}, + {2426, {wxPrintDialogData, getSelection, 0}}, + {2427, {wxPrintDialogData, getToPage, 0}}, + {2428, {wxPrintDialogData, isOk, 0}}, + {2429, {wxPrintDialogData, setCollate, 1}}, + {2430, {wxPrintDialogData, setFromPage, 1}}, + {2431, {wxPrintDialogData, setMaxPage, 1}}, + {2432, {wxPrintDialogData, setMinPage, 1}}, + {2433, {wxPrintDialogData, setNoCopies, 1}}, + {2434, {wxPrintDialogData, setPrintData, 1}}, + {2435, {wxPrintDialogData, setPrintToFile, 1}}, + {2436, {wxPrintDialogData, setSelection, 1}}, + {2437, {wxPrintDialogData, setToPage, 1}}, + {2438, {wxPrintData, new_0, 0}}, + {2439, {wxPrintData, new_1, 1}}, + {2440, {wxPrintData, destruct, 0}}, + {2441, {wxPrintData, getCollate, 0}}, + {2442, {wxPrintData, getBin, 0}}, + {2443, {wxPrintData, getColour, 0}}, + {2444, {wxPrintData, getDuplex, 0}}, + {2445, {wxPrintData, getNoCopies, 0}}, + {2446, {wxPrintData, getOrientation, 0}}, + {2447, {wxPrintData, getPaperId, 0}}, + {2448, {wxPrintData, getPrinterName, 0}}, + {2449, {wxPrintData, getQuality, 0}}, + {2450, {wxPrintData, isOk, 0}}, + {2451, {wxPrintData, setBin, 1}}, + {2452, {wxPrintData, setCollate, 1}}, + {2453, {wxPrintData, setColour, 1}}, + {2454, {wxPrintData, setDuplex, 1}}, + {2455, {wxPrintData, setNoCopies, 1}}, + {2456, {wxPrintData, setOrientation, 1}}, + {2457, {wxPrintData, setPaperId, 1}}, + {2458, {wxPrintData, setPrinterName, 1}}, + {2459, {wxPrintData, setQuality, 1}}, + {2462, {wxPrintPreview, new_2, 2}}, + {2463, {wxPrintPreview, new_3, 3}}, + {2465, {wxPrintPreview, destruct, 0}}, + {2466, {wxPrintPreview, getCanvas, 0}}, + {2467, {wxPrintPreview, getCurrentPage, 0}}, + {2468, {wxPrintPreview, getFrame, 0}}, + {2469, {wxPrintPreview, getMaxPage, 0}}, + {2470, {wxPrintPreview, getMinPage, 0}}, + {2471, {wxPrintPreview, getPrintout, 0}}, + {2472, {wxPrintPreview, getPrintoutForPrinting, 0}}, + {2473, {wxPrintPreview, isOk, 0}}, + {2474, {wxPrintPreview, paintPage, 2}}, + {2475, {wxPrintPreview, print, 1}}, + {2476, {wxPrintPreview, renderPage, 1}}, + {2477, {wxPrintPreview, setCanvas, 1}}, + {2478, {wxPrintPreview, setCurrentPage, 1}}, + {2479, {wxPrintPreview, setFrame, 1}}, + {2480, {wxPrintPreview, setPrintout, 1}}, + {2481, {wxPrintPreview, setZoom, 1}}, + {2482, {wxPreviewFrame, new, 3}}, + {2483, {wxPreviewFrame, destruct, 0}}, + {2484, {wxPreviewFrame, createControlBar, 0}}, + {2485, {wxPreviewFrame, createCanvas, 0}}, + {2486, {wxPreviewFrame, initialize, 0}}, + {2487, {wxPreviewFrame, onCloseWindow, 1}}, + {2488, {wxPreviewControlBar, new, 4}}, + {2489, {wxPreviewControlBar, destruct, 0}}, + {2490, {wxPreviewControlBar, createButtons, 0}}, + {2491, {wxPreviewControlBar, getPrintPreview, 0}}, + {2492, {wxPreviewControlBar, getZoomControl, 0}}, + {2493, {wxPreviewControlBar, setZoomControl, 1}}, + {2495, {wxPrinter, new, 1}}, + {2496, {wxPrinter, createAbortWindow, 2}}, + {2497, {wxPrinter, getAbort, 0}}, + {2498, {wxPrinter, getLastError, 0}}, + {2499, {wxPrinter, getPrintDialogData, 0}}, + {2500, {wxPrinter, print, 3}}, + {2501, {wxPrinter, printDialog, 1}}, + {2502, {wxPrinter, reportError, 3}}, + {2503, {wxPrinter, setup, 1}}, + {2504, {wxPrinter, 'Destroy', undefined}}, + {2505, {wxXmlResource, new_1, 1}}, + {2506, {wxXmlResource, new_2, 2}}, + {2507, {wxXmlResource, destruct, 0}}, + {2508, {wxXmlResource, attachUnknownControl, 3}}, + {2509, {wxXmlResource, clearHandlers, 0}}, + {2510, {wxXmlResource, compareVersion, 4}}, + {2511, {wxXmlResource, get, 0}}, + {2512, {wxXmlResource, getFlags, 0}}, + {2513, {wxXmlResource, getVersion, 0}}, + {2514, {wxXmlResource, getXRCID, 2}}, + {2515, {wxXmlResource, initAllHandlers, 0}}, + {2516, {wxXmlResource, load, 1}}, + {2517, {wxXmlResource, loadBitmap, 1}}, + {2518, {wxXmlResource, loadDialog_2, 2}}, + {2519, {wxXmlResource, loadDialog_3, 3}}, + {2520, {wxXmlResource, loadFrame_2, 2}}, + {2521, {wxXmlResource, loadFrame_3, 3}}, + {2522, {wxXmlResource, loadIcon, 1}}, + {2523, {wxXmlResource, loadMenu, 1}}, + {2524, {wxXmlResource, loadMenuBar_2, 2}}, + {2525, {wxXmlResource, loadMenuBar_1, 1}}, + {2526, {wxXmlResource, loadPanel_2, 2}}, + {2527, {wxXmlResource, loadPanel_3, 3}}, + {2528, {wxXmlResource, loadToolBar, 2}}, + {2529, {wxXmlResource, set, 1}}, + {2530, {wxXmlResource, setFlags, 1}}, + {2531, {wxXmlResource, unload, 1}}, + {2532, {wxXmlResource, xrcctrl, 3}}, + {2533, {wxHtmlEasyPrinting, new, 1}}, + {2534, {wxHtmlEasyPrinting, destruct, 0}}, + {2535, {wxHtmlEasyPrinting, getPrintData, 0}}, + {2536, {wxHtmlEasyPrinting, getPageSetupData, 0}}, + {2537, {wxHtmlEasyPrinting, previewFile, 1}}, + {2538, {wxHtmlEasyPrinting, previewText, 2}}, + {2539, {wxHtmlEasyPrinting, printFile, 1}}, + {2540, {wxHtmlEasyPrinting, printText, 2}}, + {2541, {wxHtmlEasyPrinting, pageSetup, 0}}, + {2542, {wxHtmlEasyPrinting, setFonts, 3}}, + {2543, {wxHtmlEasyPrinting, setHeader, 2}}, + {2544, {wxHtmlEasyPrinting, setFooter, 2}}, + {2546, {wxGLCanvas, new_2, 2}}, + {2547, {wxGLCanvas, new_3_1, 3}}, + {2548, {wxGLCanvas, new_3_0, 3}}, + {2549, {wxGLCanvas, getContext, 0}}, + {2551, {wxGLCanvas, setCurrent, 0}}, + {2552, {wxGLCanvas, swapBuffers, 0}}, + {2553, {wxGLCanvas, 'Destroy', undefined}}, + {2554, {wxAuiManager, new, 1}}, + {2555, {wxAuiManager, destruct, 0}}, + {2556, {wxAuiManager, addPane_2_1, 2}}, + {2557, {wxAuiManager, addPane_3, 3}}, + {2558, {wxAuiManager, addPane_2_0, 2}}, + {2559, {wxAuiManager, detachPane, 1}}, + {2560, {wxAuiManager, getAllPanes, 0}}, + {2561, {wxAuiManager, getArtProvider, 0}}, + {2562, {wxAuiManager, getDockSizeConstraint, 2}}, + {2563, {wxAuiManager, getFlags, 0}}, + {2564, {wxAuiManager, getManagedWindow, 0}}, + {2565, {wxAuiManager, getManager, 1}}, + {2566, {wxAuiManager, getPane_1_1, 1}}, + {2567, {wxAuiManager, getPane_1_0, 1}}, + {2568, {wxAuiManager, hideHint, 0}}, + {2569, {wxAuiManager, insertPane, 3}}, + {2570, {wxAuiManager, loadPaneInfo, 2}}, + {2571, {wxAuiManager, loadPerspective, 2}}, + {2572, {wxAuiManager, savePaneInfo, 1}}, + {2573, {wxAuiManager, savePerspective, 0}}, + {2574, {wxAuiManager, setArtProvider, 1}}, + {2575, {wxAuiManager, setDockSizeConstraint, 2}}, + {2576, {wxAuiManager, setFlags, 1}}, + {2577, {wxAuiManager, setManagedWindow, 1}}, + {2578, {wxAuiManager, showHint, 1}}, + {2579, {wxAuiManager, unInit, 0}}, + {2580, {wxAuiManager, update, 0}}, + {2581, {wxAuiPaneInfo, new_0, 0}}, + {2582, {wxAuiPaneInfo, new_1, 1}}, + {2583, {wxAuiPaneInfo, destruct, 0}}, + {2584, {wxAuiPaneInfo, bestSize_1, 1}}, + {2585, {wxAuiPaneInfo, bestSize_2, 2}}, + {2586, {wxAuiPaneInfo, bottom, 0}}, + {2587, {wxAuiPaneInfo, bottomDockable, 1}}, + {2588, {wxAuiPaneInfo, caption, 1}}, + {2589, {wxAuiPaneInfo, captionVisible, 1}}, + {2590, {wxAuiPaneInfo, centre, 0}}, + {2591, {wxAuiPaneInfo, centrePane, 0}}, + {2592, {wxAuiPaneInfo, closeButton, 1}}, + {2593, {wxAuiPaneInfo, defaultPane, 0}}, + {2594, {wxAuiPaneInfo, destroyOnClose, 1}}, + {2595, {wxAuiPaneInfo, direction, 1}}, + {2596, {wxAuiPaneInfo, dock, 0}}, + {2597, {wxAuiPaneInfo, dockable, 1}}, + {2598, {wxAuiPaneInfo, fixed, 0}}, + {2599, {wxAuiPaneInfo, float, 0}}, + {2600, {wxAuiPaneInfo, floatable, 1}}, + {2601, {wxAuiPaneInfo, floatingPosition_1, 1}}, + {2602, {wxAuiPaneInfo, floatingPosition_2, 2}}, + {2603, {wxAuiPaneInfo, floatingSize_1, 1}}, + {2604, {wxAuiPaneInfo, floatingSize_2, 2}}, + {2605, {wxAuiPaneInfo, gripper, 1}}, + {2606, {wxAuiPaneInfo, gripperTop, 1}}, + {2607, {wxAuiPaneInfo, hasBorder, 0}}, + {2608, {wxAuiPaneInfo, hasCaption, 0}}, + {2609, {wxAuiPaneInfo, hasCloseButton, 0}}, + {2610, {wxAuiPaneInfo, hasFlag, 1}}, + {2611, {wxAuiPaneInfo, hasGripper, 0}}, + {2612, {wxAuiPaneInfo, hasGripperTop, 0}}, + {2613, {wxAuiPaneInfo, hasMaximizeButton, 0}}, + {2614, {wxAuiPaneInfo, hasMinimizeButton, 0}}, + {2615, {wxAuiPaneInfo, hasPinButton, 0}}, + {2616, {wxAuiPaneInfo, hide, 0}}, + {2617, {wxAuiPaneInfo, isBottomDockable, 0}}, + {2618, {wxAuiPaneInfo, isDocked, 0}}, + {2619, {wxAuiPaneInfo, isFixed, 0}}, + {2620, {wxAuiPaneInfo, isFloatable, 0}}, + {2621, {wxAuiPaneInfo, isFloating, 0}}, + {2622, {wxAuiPaneInfo, isLeftDockable, 0}}, + {2623, {wxAuiPaneInfo, isMovable, 0}}, + {2624, {wxAuiPaneInfo, isOk, 0}}, + {2625, {wxAuiPaneInfo, isResizable, 0}}, + {2626, {wxAuiPaneInfo, isRightDockable, 0}}, + {2627, {wxAuiPaneInfo, isShown, 0}}, + {2628, {wxAuiPaneInfo, isToolbar, 0}}, + {2629, {wxAuiPaneInfo, isTopDockable, 0}}, + {2630, {wxAuiPaneInfo, layer, 1}}, + {2631, {wxAuiPaneInfo, left, 0}}, + {2632, {wxAuiPaneInfo, leftDockable, 1}}, + {2633, {wxAuiPaneInfo, maxSize_1, 1}}, + {2634, {wxAuiPaneInfo, maxSize_2, 2}}, + {2635, {wxAuiPaneInfo, maximizeButton, 1}}, + {2636, {wxAuiPaneInfo, minSize_1, 1}}, + {2637, {wxAuiPaneInfo, minSize_2, 2}}, + {2638, {wxAuiPaneInfo, minimizeButton, 1}}, + {2639, {wxAuiPaneInfo, movable, 1}}, + {2640, {wxAuiPaneInfo, name, 1}}, + {2641, {wxAuiPaneInfo, paneBorder, 1}}, + {2642, {wxAuiPaneInfo, pinButton, 1}}, + {2643, {wxAuiPaneInfo, position, 1}}, + {2644, {wxAuiPaneInfo, resizable, 1}}, + {2645, {wxAuiPaneInfo, right, 0}}, + {2646, {wxAuiPaneInfo, rightDockable, 1}}, + {2647, {wxAuiPaneInfo, row, 1}}, + {2648, {wxAuiPaneInfo, safeSet, 1}}, + {2649, {wxAuiPaneInfo, setFlag, 2}}, + {2650, {wxAuiPaneInfo, show, 1}}, + {2651, {wxAuiPaneInfo, toolbarPane, 0}}, + {2652, {wxAuiPaneInfo, top, 0}}, + {2653, {wxAuiPaneInfo, topDockable, 1}}, + {2654, {wxAuiPaneInfo, window, 1}}, + {2655, {wxAuiPaneInfo, getWindow, 0}}, + {2656, {wxAuiPaneInfo, getFrame, 0}}, + {2657, {wxAuiPaneInfo, getDirection, 0}}, + {2658, {wxAuiPaneInfo, getLayer, 0}}, + {2659, {wxAuiPaneInfo, getRow, 0}}, + {2660, {wxAuiPaneInfo, getPosition, 0}}, + {2661, {wxAuiPaneInfo, getFloatingPosition, 0}}, + {2662, {wxAuiPaneInfo, getFloatingSize, 0}}, + {2663, {wxAuiNotebook, new_0, 0}}, + {2664, {wxAuiNotebook, new_2, 2}}, + {2665, {wxAuiNotebook, addPage, 3}}, + {2666, {wxAuiNotebook, create, 2}}, + {2667, {wxAuiNotebook, deletePage, 1}}, + {2668, {wxAuiNotebook, getArtProvider, 0}}, + {2669, {wxAuiNotebook, getPage, 1}}, + {2670, {wxAuiNotebook, getPageBitmap, 1}}, + {2671, {wxAuiNotebook, getPageCount, 0}}, + {2672, {wxAuiNotebook, getPageIndex, 1}}, + {2673, {wxAuiNotebook, getPageText, 1}}, + {2674, {wxAuiNotebook, getSelection, 0}}, + {2675, {wxAuiNotebook, insertPage, 4}}, + {2676, {wxAuiNotebook, removePage, 1}}, + {2677, {wxAuiNotebook, setArtProvider, 1}}, + {2678, {wxAuiNotebook, setFont, 1}}, + {2679, {wxAuiNotebook, setPageBitmap, 2}}, + {2680, {wxAuiNotebook, setPageText, 2}}, + {2681, {wxAuiNotebook, setSelection, 1}}, + {2682, {wxAuiNotebook, setTabCtrlHeight, 1}}, + {2683, {wxAuiNotebook, setUniformBitmapSize, 1}}, + {2684, {wxAuiNotebook, 'Destroy', undefined}}, + {2685, {wxAuiTabArt, setFlags, 1}}, + {2686, {wxAuiTabArt, setMeasuringFont, 1}}, + {2687, {wxAuiTabArt, setNormalFont, 1}}, + {2688, {wxAuiTabArt, setSelectedFont, 1}}, + {2689, {wxAuiTabArt, setColour, 1}}, + {2690, {wxAuiTabArt, setActiveColour, 1}}, + {2691, {wxAuiDockArt, getColour, 1}}, + {2692, {wxAuiDockArt, getFont, 1}}, + {2693, {wxAuiDockArt, getMetric, 1}}, + {2694, {wxAuiDockArt, setColour, 2}}, + {2695, {wxAuiDockArt, setFont, 2}}, + {2696, {wxAuiDockArt, setMetric, 2}}, + {2697, {wxAuiSimpleTabArt, new, 0}}, + {2698, {wxAuiSimpleTabArt, 'Destroy', undefined}}, + {2699, {wxMDIParentFrame, new_0, 0}}, + {2700, {wxMDIParentFrame, new_4, 4}}, + {2701, {wxMDIParentFrame, destruct, 0}}, + {2702, {wxMDIParentFrame, activateNext, 0}}, + {2703, {wxMDIParentFrame, activatePrevious, 0}}, + {2704, {wxMDIParentFrame, arrangeIcons, 0}}, + {2705, {wxMDIParentFrame, cascade, 0}}, + {2706, {wxMDIParentFrame, create, 4}}, + {2707, {wxMDIParentFrame, getActiveChild, 0}}, + {2708, {wxMDIParentFrame, getClientWindow, 0}}, + {2709, {wxMDIParentFrame, tile, 1}}, + {2710, {wxMDIChildFrame, new_0, 0}}, + {2711, {wxMDIChildFrame, new_4, 4}}, + {2712, {wxMDIChildFrame, destruct, 0}}, + {2713, {wxMDIChildFrame, activate, 0}}, + {2714, {wxMDIChildFrame, create, 4}}, + {2715, {wxMDIChildFrame, maximize, 1}}, + {2716, {wxMDIChildFrame, restore, 0}}, + {2717, {wxMDIClientWindow, new_0, 0}}, + {2718, {wxMDIClientWindow, new_2, 2}}, + {2719, {wxMDIClientWindow, destruct, 0}}, + {2720, {wxMDIClientWindow, createClient, 2}}, + {2721, {wxLayoutAlgorithm, new, 0}}, + {2722, {wxLayoutAlgorithm, layoutFrame, 2}}, + {2723, {wxLayoutAlgorithm, layoutMDIFrame, 2}}, + {2724, {wxLayoutAlgorithm, layoutWindow, 2}}, + {2725, {wxLayoutAlgorithm, 'Destroy', undefined}}, + {2726, {wxEvent, getId, 0}}, + {2727, {wxEvent, getSkipped, 0}}, + {2728, {wxEvent, getTimestamp, 0}}, + {2729, {wxEvent, isCommandEvent, 0}}, + {2730, {wxEvent, resumePropagation, 1}}, + {2731, {wxEvent, shouldPropagate, 0}}, + {2732, {wxEvent, skip, 1}}, + {2733, {wxEvent, stopPropagation, 0}}, + {2734, {wxCommandEvent, getClientData, 0}}, + {2735, {wxCommandEvent, getExtraLong, 0}}, + {2736, {wxCommandEvent, getInt, 0}}, + {2737, {wxCommandEvent, getSelection, 0}}, + {2738, {wxCommandEvent, getString, 0}}, + {2739, {wxCommandEvent, isChecked, 0}}, + {2740, {wxCommandEvent, isSelection, 0}}, + {2741, {wxCommandEvent, setInt, 1}}, + {2742, {wxCommandEvent, setString, 1}}, + {2743, {wxScrollEvent, getOrientation, 0}}, + {2744, {wxScrollEvent, getPosition, 0}}, + {2745, {wxScrollWinEvent, getOrientation, 0}}, + {2746, {wxScrollWinEvent, getPosition, 0}}, + {2747, {wxMouseEvent, altDown, 0}}, + {2748, {wxMouseEvent, button, 1}}, + {2749, {wxMouseEvent, buttonDClick, 1}}, + {2750, {wxMouseEvent, buttonDown, 1}}, + {2751, {wxMouseEvent, buttonUp, 1}}, + {2752, {wxMouseEvent, cmdDown, 0}}, + {2753, {wxMouseEvent, controlDown, 0}}, + {2754, {wxMouseEvent, dragging, 0}}, + {2755, {wxMouseEvent, entering, 0}}, + {2756, {wxMouseEvent, getButton, 0}}, + {2759, {wxMouseEvent, getPosition, 0}}, + {2760, {wxMouseEvent, getLogicalPosition, 1}}, + {2761, {wxMouseEvent, getLinesPerAction, 0}}, + {2762, {wxMouseEvent, getWheelRotation, 0}}, + {2763, {wxMouseEvent, getWheelDelta, 0}}, + {2764, {wxMouseEvent, getX, 0}}, + {2765, {wxMouseEvent, getY, 0}}, + {2766, {wxMouseEvent, isButton, 0}}, + {2767, {wxMouseEvent, isPageScroll, 0}}, + {2768, {wxMouseEvent, leaving, 0}}, + {2769, {wxMouseEvent, leftDClick, 0}}, + {2770, {wxMouseEvent, leftDown, 0}}, + {2771, {wxMouseEvent, leftIsDown, 0}}, + {2772, {wxMouseEvent, leftUp, 0}}, + {2773, {wxMouseEvent, metaDown, 0}}, + {2774, {wxMouseEvent, middleDClick, 0}}, + {2775, {wxMouseEvent, middleDown, 0}}, + {2776, {wxMouseEvent, middleIsDown, 0}}, + {2777, {wxMouseEvent, middleUp, 0}}, + {2778, {wxMouseEvent, moving, 0}}, + {2779, {wxMouseEvent, rightDClick, 0}}, + {2780, {wxMouseEvent, rightDown, 0}}, + {2781, {wxMouseEvent, rightIsDown, 0}}, + {2782, {wxMouseEvent, rightUp, 0}}, + {2783, {wxMouseEvent, shiftDown, 0}}, + {2784, {wxSetCursorEvent, getCursor, 0}}, + {2785, {wxSetCursorEvent, getX, 0}}, + {2786, {wxSetCursorEvent, getY, 0}}, + {2787, {wxSetCursorEvent, hasCursor, 0}}, + {2788, {wxSetCursorEvent, setCursor, 1}}, + {2789, {wxKeyEvent, altDown, 0}}, + {2790, {wxKeyEvent, cmdDown, 0}}, + {2791, {wxKeyEvent, controlDown, 0}}, + {2792, {wxKeyEvent, getKeyCode, 0}}, + {2793, {wxKeyEvent, getModifiers, 0}}, + {2796, {wxKeyEvent, getPosition, 0}}, + {2797, {wxKeyEvent, getRawKeyCode, 0}}, + {2798, {wxKeyEvent, getRawKeyFlags, 0}}, + {2799, {wxKeyEvent, getUnicodeKey, 0}}, + {2800, {wxKeyEvent, getX, 0}}, + {2801, {wxKeyEvent, getY, 0}}, + {2802, {wxKeyEvent, hasModifiers, 0}}, + {2803, {wxKeyEvent, metaDown, 0}}, + {2804, {wxKeyEvent, shiftDown, 0}}, + {2805, {wxSizeEvent, getSize, 0}}, + {2806, {wxMoveEvent, getPosition, 0}}, + {2807, {wxEraseEvent, getDC, 0}}, + {2808, {wxFocusEvent, getWindow, 0}}, + {2809, {wxChildFocusEvent, getWindow, 0}}, + {2810, {wxMenuEvent, getMenu, 0}}, + {2811, {wxMenuEvent, getMenuId, 0}}, + {2812, {wxMenuEvent, isPopup, 0}}, + {2813, {wxCloseEvent, canVeto, 0}}, + {2814, {wxCloseEvent, getLoggingOff, 0}}, + {2815, {wxCloseEvent, setCanVeto, 1}}, + {2816, {wxCloseEvent, setLoggingOff, 1}}, + {2817, {wxCloseEvent, veto, 1}}, + {2818, {wxShowEvent, setShow, 1}}, + {2819, {wxShowEvent, getShow, 0}}, + {2820, {wxIconizeEvent, iconized, 0}}, + {2821, {wxJoystickEvent, buttonDown, 1}}, + {2822, {wxJoystickEvent, buttonIsDown, 1}}, + {2823, {wxJoystickEvent, buttonUp, 1}}, + {2824, {wxJoystickEvent, getButtonChange, 0}}, + {2825, {wxJoystickEvent, getButtonState, 0}}, + {2826, {wxJoystickEvent, getJoystick, 0}}, + {2827, {wxJoystickEvent, getPosition, 0}}, + {2828, {wxJoystickEvent, getZPosition, 0}}, + {2829, {wxJoystickEvent, isButton, 0}}, + {2830, {wxJoystickEvent, isMove, 0}}, + {2831, {wxJoystickEvent, isZMove, 0}}, + {2832, {wxUpdateUIEvent, canUpdate, 1}}, + {2833, {wxUpdateUIEvent, check, 1}}, + {2834, {wxUpdateUIEvent, enable, 1}}, + {2835, {wxUpdateUIEvent, show, 1}}, + {2836, {wxUpdateUIEvent, getChecked, 0}}, + {2837, {wxUpdateUIEvent, getEnabled, 0}}, + {2838, {wxUpdateUIEvent, getShown, 0}}, + {2839, {wxUpdateUIEvent, getSetChecked, 0}}, + {2840, {wxUpdateUIEvent, getSetEnabled, 0}}, + {2841, {wxUpdateUIEvent, getSetShown, 0}}, + {2842, {wxUpdateUIEvent, getSetText, 0}}, + {2843, {wxUpdateUIEvent, getText, 0}}, + {2844, {wxUpdateUIEvent, getMode, 0}}, + {2845, {wxUpdateUIEvent, getUpdateInterval, 0}}, + {2846, {wxUpdateUIEvent, resetUpdateTime, 0}}, + {2847, {wxUpdateUIEvent, setMode, 1}}, + {2848, {wxUpdateUIEvent, setText, 1}}, + {2849, {wxUpdateUIEvent, setUpdateInterval, 1}}, + {2850, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}}, + {2851, {wxPaletteChangedEvent, setChangedWindow, 1}}, + {2852, {wxPaletteChangedEvent, getChangedWindow, 0}}, + {2853, {wxQueryNewPaletteEvent, setPaletteRealized, 1}}, + {2854, {wxQueryNewPaletteEvent, getPaletteRealized, 0}}, + {2855, {wxNavigationKeyEvent, getDirection, 0}}, + {2856, {wxNavigationKeyEvent, setDirection, 1}}, + {2857, {wxNavigationKeyEvent, isWindowChange, 0}}, + {2858, {wxNavigationKeyEvent, setWindowChange, 1}}, + {2859, {wxNavigationKeyEvent, isFromTab, 0}}, + {2860, {wxNavigationKeyEvent, setFromTab, 1}}, + {2861, {wxNavigationKeyEvent, getCurrentFocus, 0}}, + {2862, {wxNavigationKeyEvent, setCurrentFocus, 1}}, + {2863, {wxHelpEvent, getOrigin, 0}}, + {2864, {wxHelpEvent, getPosition, 0}}, + {2865, {wxHelpEvent, setOrigin, 1}}, + {2866, {wxHelpEvent, setPosition, 1}}, + {2867, {wxContextMenuEvent, getPosition, 0}}, + {2868, {wxContextMenuEvent, setPosition, 1}}, + {2869, {wxIdleEvent, canSend, 1}}, + {2870, {wxIdleEvent, getMode, 0}}, + {2871, {wxIdleEvent, requestMore, 1}}, + {2872, {wxIdleEvent, moreRequested, 0}}, + {2873, {wxIdleEvent, setMode, 1}}, + {2874, {wxGridEvent, altDown, 0}}, + {2875, {wxGridEvent, controlDown, 0}}, + {2876, {wxGridEvent, getCol, 0}}, + {2877, {wxGridEvent, getPosition, 0}}, + {2878, {wxGridEvent, getRow, 0}}, + {2879, {wxGridEvent, metaDown, 0}}, + {2880, {wxGridEvent, selecting, 0}}, + {2881, {wxGridEvent, shiftDown, 0}}, + {2882, {wxNotifyEvent, allow, 0}}, + {2883, {wxNotifyEvent, isAllowed, 0}}, + {2884, {wxNotifyEvent, veto, 0}}, + {2885, {wxSashEvent, getEdge, 0}}, + {2886, {wxSashEvent, getDragRect, 0}}, + {2887, {wxSashEvent, getDragStatus, 0}}, + {2888, {wxListEvent, getCacheFrom, 0}}, + {2889, {wxListEvent, getCacheTo, 0}}, + {2890, {wxListEvent, getKeyCode, 0}}, + {2891, {wxListEvent, getIndex, 0}}, + {2892, {wxListEvent, getColumn, 0}}, + {2893, {wxListEvent, getPoint, 0}}, + {2894, {wxListEvent, getLabel, 0}}, + {2895, {wxListEvent, getText, 0}}, + {2896, {wxListEvent, getImage, 0}}, + {2897, {wxListEvent, getData, 0}}, + {2898, {wxListEvent, getMask, 0}}, + {2899, {wxListEvent, getItem, 0}}, + {2900, {wxListEvent, isEditCancelled, 0}}, + {2901, {wxDateEvent, getDate, 0}}, + {2902, {wxCalendarEvent, getWeekDay, 0}}, + {2903, {wxFileDirPickerEvent, getPath, 0}}, + {2904, {wxColourPickerEvent, getColour, 0}}, + {2905, {wxFontPickerEvent, getFont, 0}}, + {2906, {wxStyledTextEvent, getPosition, 0}}, + {2907, {wxStyledTextEvent, getKey, 0}}, + {2908, {wxStyledTextEvent, getModifiers, 0}}, + {2909, {wxStyledTextEvent, getModificationType, 0}}, + {2910, {wxStyledTextEvent, getText, 0}}, + {2911, {wxStyledTextEvent, getLength, 0}}, + {2912, {wxStyledTextEvent, getLinesAdded, 0}}, + {2913, {wxStyledTextEvent, getLine, 0}}, + {2914, {wxStyledTextEvent, getFoldLevelNow, 0}}, + {2915, {wxStyledTextEvent, getFoldLevelPrev, 0}}, + {2916, {wxStyledTextEvent, getMargin, 0}}, + {2917, {wxStyledTextEvent, getMessage, 0}}, + {2918, {wxStyledTextEvent, getWParam, 0}}, + {2919, {wxStyledTextEvent, getLParam, 0}}, + {2920, {wxStyledTextEvent, getListType, 0}}, + {2921, {wxStyledTextEvent, getX, 0}}, + {2922, {wxStyledTextEvent, getY, 0}}, + {2923, {wxStyledTextEvent, getDragText, 0}}, + {2924, {wxStyledTextEvent, getDragAllowMove, 0}}, + {2925, {wxStyledTextEvent, getDragResult, 0}}, + {2926, {wxStyledTextEvent, getShift, 0}}, + {2927, {wxStyledTextEvent, getControl, 0}}, + {2928, {wxStyledTextEvent, getAlt, 0}}, + {2929, {utils, getKeyState, 1}}, + {2930, {utils, getMousePosition, 2}}, + {2931, {utils, getMouseState, 0}}, + {2932, {utils, setDetectableAutoRepeat, 1}}, + {2933, {utils, bell, 0}}, + {2934, {utils, findMenuItemId, 3}}, + {2935, {utils, genericFindWindowAtPoint, 1}}, + {2936, {utils, findWindowAtPoint, 1}}, + {2937, {utils, beginBusyCursor, 1}}, + {2938, {utils, endBusyCursor, 0}}, + {2939, {utils, isBusy, 0}}, + {2940, {utils, shutdown, 1}}, + {2941, {utils, shell, 1}}, + {2942, {utils, launchDefaultBrowser, 2}}, + {2943, {utils, getEmailAddress, 0}}, + {2944, {utils, getUserId, 0}}, + {2945, {utils, getHomeDir, 0}}, + {2946, {utils, newId, 0}}, + {2947, {utils, registerId, 1}}, + {2948, {utils, getCurrentId, 0}}, + {2949, {utils, getOsDescription, 0}}, + {2950, {utils, isPlatformLittleEndian, 0}}, + {2951, {utils, isPlatform64Bit, 0}}, + {2952, {gdicmn, displaySize, 2}}, + {2953, {gdicmn, setCursor, 1}}, + {2954, {wxPrintout, new, 1}}, + {2955, {wxPrintout, destruct, 0}}, + {2956, {wxPrintout, getDC, 0}}, + {2957, {wxPrintout, getPageSizeMM, 2}}, + {2958, {wxPrintout, getPageSizePixels, 2}}, + {2959, {wxPrintout, getPaperRectPixels, 0}}, + {2960, {wxPrintout, getPPIPrinter, 2}}, + {2961, {wxPrintout, getPPIScreen, 2}}, + {2962, {wxPrintout, getTitle, 0}}, + {2963, {wxPrintout, isPreview, 0}}, + {2964, {wxPrintout, fitThisSizeToPaper, 1}}, + {2965, {wxPrintout, fitThisSizeToPage, 1}}, + {2966, {wxPrintout, fitThisSizeToPageMargins, 2}}, + {2967, {wxPrintout, mapScreenSizeToPaper, 0}}, + {2968, {wxPrintout, mapScreenSizeToPage, 0}}, + {2969, {wxPrintout, mapScreenSizeToPageMargins, 1}}, + {2970, {wxPrintout, mapScreenSizeToDevice, 0}}, + {2971, {wxPrintout, getLogicalPaperRect, 0}}, + {2972, {wxPrintout, getLogicalPageRect, 0}}, + {2973, {wxPrintout, getLogicalPageMarginsRect, 1}}, + {2974, {wxPrintout, setLogicalOrigin, 2}}, + {2975, {wxPrintout, offsetLogicalOrigin, 2}}, + {2976, {wxStyledTextCtrl, new_2, 2}}, + {2977, {wxStyledTextCtrl, new_0, 0}}, + {2978, {wxStyledTextCtrl, destruct, 0}}, + {2979, {wxStyledTextCtrl, create, 2}}, + {2980, {wxStyledTextCtrl, addText, 1}}, + {2981, {wxStyledTextCtrl, addStyledText, 1}}, + {2982, {wxStyledTextCtrl, insertText, 2}}, + {2983, {wxStyledTextCtrl, clearAll, 0}}, + {2984, {wxStyledTextCtrl, clearDocumentStyle, 0}}, + {2985, {wxStyledTextCtrl, getLength, 0}}, + {2986, {wxStyledTextCtrl, getCharAt, 1}}, + {2987, {wxStyledTextCtrl, getCurrentPos, 0}}, + {2988, {wxStyledTextCtrl, getAnchor, 0}}, + {2989, {wxStyledTextCtrl, getStyleAt, 1}}, + {2990, {wxStyledTextCtrl, redo, 0}}, + {2991, {wxStyledTextCtrl, setUndoCollection, 1}}, + {2992, {wxStyledTextCtrl, selectAll, 0}}, + {2993, {wxStyledTextCtrl, setSavePoint, 0}}, + {2994, {wxStyledTextCtrl, getStyledText, 2}}, + {2995, {wxStyledTextCtrl, canRedo, 0}}, + {2996, {wxStyledTextCtrl, markerLineFromHandle, 1}}, + {2997, {wxStyledTextCtrl, markerDeleteHandle, 1}}, + {2998, {wxStyledTextCtrl, getUndoCollection, 0}}, + {2999, {wxStyledTextCtrl, getViewWhiteSpace, 0}}, + {3000, {wxStyledTextCtrl, setViewWhiteSpace, 1}}, + {3001, {wxStyledTextCtrl, positionFromPoint, 1}}, + {3002, {wxStyledTextCtrl, positionFromPointClose, 2}}, + {3003, {wxStyledTextCtrl, gotoLine, 1}}, + {3004, {wxStyledTextCtrl, gotoPos, 1}}, + {3005, {wxStyledTextCtrl, setAnchor, 1}}, + {3006, {wxStyledTextCtrl, getCurLine, 1}}, + {3007, {wxStyledTextCtrl, getEndStyled, 0}}, + {3008, {wxStyledTextCtrl, convertEOLs, 1}}, + {3009, {wxStyledTextCtrl, getEOLMode, 0}}, + {3010, {wxStyledTextCtrl, setEOLMode, 1}}, + {3011, {wxStyledTextCtrl, startStyling, 2}}, + {3012, {wxStyledTextCtrl, setStyling, 2}}, + {3013, {wxStyledTextCtrl, getBufferedDraw, 0}}, + {3014, {wxStyledTextCtrl, setBufferedDraw, 1}}, + {3015, {wxStyledTextCtrl, setTabWidth, 1}}, + {3016, {wxStyledTextCtrl, getTabWidth, 0}}, + {3017, {wxStyledTextCtrl, setCodePage, 1}}, + {3018, {wxStyledTextCtrl, markerDefine, 3}}, + {3019, {wxStyledTextCtrl, markerSetForeground, 2}}, + {3020, {wxStyledTextCtrl, markerSetBackground, 2}}, + {3021, {wxStyledTextCtrl, markerAdd, 2}}, + {3022, {wxStyledTextCtrl, markerDelete, 2}}, + {3023, {wxStyledTextCtrl, markerDeleteAll, 1}}, + {3024, {wxStyledTextCtrl, markerGet, 1}}, + {3025, {wxStyledTextCtrl, markerNext, 2}}, + {3026, {wxStyledTextCtrl, markerPrevious, 2}}, + {3027, {wxStyledTextCtrl, markerDefineBitmap, 2}}, + {3028, {wxStyledTextCtrl, markerAddSet, 2}}, + {3029, {wxStyledTextCtrl, markerSetAlpha, 2}}, + {3030, {wxStyledTextCtrl, setMarginType, 2}}, + {3031, {wxStyledTextCtrl, getMarginType, 1}}, + {3032, {wxStyledTextCtrl, setMarginWidth, 2}}, + {3033, {wxStyledTextCtrl, getMarginWidth, 1}}, + {3034, {wxStyledTextCtrl, setMarginMask, 2}}, + {3035, {wxStyledTextCtrl, getMarginMask, 1}}, + {3036, {wxStyledTextCtrl, setMarginSensitive, 2}}, + {3037, {wxStyledTextCtrl, getMarginSensitive, 1}}, + {3038, {wxStyledTextCtrl, styleClearAll, 0}}, + {3039, {wxStyledTextCtrl, styleSetForeground, 2}}, + {3040, {wxStyledTextCtrl, styleSetBackground, 2}}, + {3041, {wxStyledTextCtrl, styleSetBold, 2}}, + {3042, {wxStyledTextCtrl, styleSetItalic, 2}}, + {3043, {wxStyledTextCtrl, styleSetSize, 2}}, + {3044, {wxStyledTextCtrl, styleSetFaceName, 2}}, + {3045, {wxStyledTextCtrl, styleSetEOLFilled, 2}}, + {3046, {wxStyledTextCtrl, styleResetDefault, 0}}, + {3047, {wxStyledTextCtrl, styleSetUnderline, 2}}, + {3048, {wxStyledTextCtrl, styleSetCase, 2}}, + {3049, {wxStyledTextCtrl, styleSetHotSpot, 2}}, + {3050, {wxStyledTextCtrl, setSelForeground, 2}}, + {3051, {wxStyledTextCtrl, setSelBackground, 2}}, + {3052, {wxStyledTextCtrl, getSelAlpha, 0}}, + {3053, {wxStyledTextCtrl, setSelAlpha, 1}}, + {3054, {wxStyledTextCtrl, setCaretForeground, 1}}, + {3055, {wxStyledTextCtrl, cmdKeyAssign, 3}}, + {3056, {wxStyledTextCtrl, cmdKeyClear, 2}}, + {3057, {wxStyledTextCtrl, cmdKeyClearAll, 0}}, + {3058, {wxStyledTextCtrl, setStyleBytes, 2}}, + {3059, {wxStyledTextCtrl, styleSetVisible, 2}}, + {3060, {wxStyledTextCtrl, getCaretPeriod, 0}}, + {3061, {wxStyledTextCtrl, setCaretPeriod, 1}}, + {3062, {wxStyledTextCtrl, setWordChars, 1}}, + {3063, {wxStyledTextCtrl, beginUndoAction, 0}}, + {3064, {wxStyledTextCtrl, endUndoAction, 0}}, + {3065, {wxStyledTextCtrl, indicatorSetStyle, 2}}, + {3066, {wxStyledTextCtrl, indicatorGetStyle, 1}}, + {3067, {wxStyledTextCtrl, indicatorSetForeground, 2}}, + {3068, {wxStyledTextCtrl, indicatorGetForeground, 1}}, + {3069, {wxStyledTextCtrl, setWhitespaceForeground, 2}}, + {3070, {wxStyledTextCtrl, setWhitespaceBackground, 2}}, + {3071, {wxStyledTextCtrl, getStyleBits, 0}}, + {3072, {wxStyledTextCtrl, setLineState, 2}}, + {3073, {wxStyledTextCtrl, getLineState, 1}}, + {3074, {wxStyledTextCtrl, getMaxLineState, 0}}, + {3075, {wxStyledTextCtrl, getCaretLineVisible, 0}}, + {3076, {wxStyledTextCtrl, setCaretLineVisible, 1}}, + {3077, {wxStyledTextCtrl, getCaretLineBackground, 0}}, + {3078, {wxStyledTextCtrl, setCaretLineBackground, 1}}, + {3079, {wxStyledTextCtrl, autoCompShow, 2}}, + {3080, {wxStyledTextCtrl, autoCompCancel, 0}}, + {3081, {wxStyledTextCtrl, autoCompActive, 0}}, + {3082, {wxStyledTextCtrl, autoCompPosStart, 0}}, + {3083, {wxStyledTextCtrl, autoCompComplete, 0}}, + {3084, {wxStyledTextCtrl, autoCompStops, 1}}, + {3085, {wxStyledTextCtrl, autoCompSetSeparator, 1}}, + {3086, {wxStyledTextCtrl, autoCompGetSeparator, 0}}, + {3087, {wxStyledTextCtrl, autoCompSelect, 1}}, + {3088, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}}, + {3089, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}}, + {3090, {wxStyledTextCtrl, autoCompSetFillUps, 1}}, + {3091, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}}, + {3092, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}}, + {3093, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}}, + {3094, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}}, + {3095, {wxStyledTextCtrl, userListShow, 2}}, + {3096, {wxStyledTextCtrl, autoCompSetAutoHide, 1}}, + {3097, {wxStyledTextCtrl, autoCompGetAutoHide, 0}}, + {3098, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}}, + {3099, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}}, + {3100, {wxStyledTextCtrl, registerImage, 2}}, + {3101, {wxStyledTextCtrl, clearRegisteredImages, 0}}, + {3102, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}}, + {3103, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}}, + {3104, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}}, + {3105, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}}, + {3106, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}}, + {3107, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}}, + {3108, {wxStyledTextCtrl, setIndent, 1}}, + {3109, {wxStyledTextCtrl, getIndent, 0}}, + {3110, {wxStyledTextCtrl, setUseTabs, 1}}, + {3111, {wxStyledTextCtrl, getUseTabs, 0}}, + {3112, {wxStyledTextCtrl, setLineIndentation, 2}}, + {3113, {wxStyledTextCtrl, getLineIndentation, 1}}, + {3114, {wxStyledTextCtrl, getLineIndentPosition, 1}}, + {3115, {wxStyledTextCtrl, getColumn, 1}}, + {3116, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}}, + {3117, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}}, + {3118, {wxStyledTextCtrl, setIndentationGuides, 1}}, + {3119, {wxStyledTextCtrl, getIndentationGuides, 0}}, + {3120, {wxStyledTextCtrl, setHighlightGuide, 1}}, + {3121, {wxStyledTextCtrl, getHighlightGuide, 0}}, + {3122, {wxStyledTextCtrl, getLineEndPosition, 1}}, + {3123, {wxStyledTextCtrl, getCodePage, 0}}, + {3124, {wxStyledTextCtrl, getCaretForeground, 0}}, + {3125, {wxStyledTextCtrl, getReadOnly, 0}}, + {3126, {wxStyledTextCtrl, setCurrentPos, 1}}, + {3127, {wxStyledTextCtrl, setSelectionStart, 1}}, + {3128, {wxStyledTextCtrl, getSelectionStart, 0}}, + {3129, {wxStyledTextCtrl, setSelectionEnd, 1}}, + {3130, {wxStyledTextCtrl, getSelectionEnd, 0}}, + {3131, {wxStyledTextCtrl, setPrintMagnification, 1}}, + {3132, {wxStyledTextCtrl, getPrintMagnification, 0}}, + {3133, {wxStyledTextCtrl, setPrintColourMode, 1}}, + {3134, {wxStyledTextCtrl, getPrintColourMode, 0}}, + {3135, {wxStyledTextCtrl, findText, 4}}, + {3136, {wxStyledTextCtrl, formatRange, 7}}, + {3137, {wxStyledTextCtrl, getFirstVisibleLine, 0}}, + {3138, {wxStyledTextCtrl, getLine, 1}}, + {3139, {wxStyledTextCtrl, getLineCount, 0}}, + {3140, {wxStyledTextCtrl, setMarginLeft, 1}}, + {3141, {wxStyledTextCtrl, getMarginLeft, 0}}, + {3142, {wxStyledTextCtrl, setMarginRight, 1}}, + {3143, {wxStyledTextCtrl, getMarginRight, 0}}, + {3144, {wxStyledTextCtrl, getModify, 0}}, + {3145, {wxStyledTextCtrl, setSelection, 2}}, + {3146, {wxStyledTextCtrl, getSelectedText, 0}}, + {3147, {wxStyledTextCtrl, getTextRange, 2}}, + {3148, {wxStyledTextCtrl, hideSelection, 1}}, + {3149, {wxStyledTextCtrl, lineFromPosition, 1}}, + {3150, {wxStyledTextCtrl, positionFromLine, 1}}, + {3151, {wxStyledTextCtrl, lineScroll, 2}}, + {3152, {wxStyledTextCtrl, ensureCaretVisible, 0}}, + {3153, {wxStyledTextCtrl, replaceSelection, 1}}, + {3154, {wxStyledTextCtrl, setReadOnly, 1}}, + {3155, {wxStyledTextCtrl, canPaste, 0}}, + {3156, {wxStyledTextCtrl, canUndo, 0}}, + {3157, {wxStyledTextCtrl, emptyUndoBuffer, 0}}, + {3158, {wxStyledTextCtrl, undo, 0}}, + {3159, {wxStyledTextCtrl, cut, 0}}, + {3160, {wxStyledTextCtrl, copy, 0}}, + {3161, {wxStyledTextCtrl, paste, 0}}, + {3162, {wxStyledTextCtrl, clear, 0}}, + {3163, {wxStyledTextCtrl, setText, 1}}, + {3164, {wxStyledTextCtrl, getText, 0}}, + {3165, {wxStyledTextCtrl, getTextLength, 0}}, + {3166, {wxStyledTextCtrl, getOvertype, 0}}, + {3167, {wxStyledTextCtrl, setCaretWidth, 1}}, + {3168, {wxStyledTextCtrl, getCaretWidth, 0}}, + {3169, {wxStyledTextCtrl, setTargetStart, 1}}, + {3170, {wxStyledTextCtrl, getTargetStart, 0}}, + {3171, {wxStyledTextCtrl, setTargetEnd, 1}}, + {3172, {wxStyledTextCtrl, getTargetEnd, 0}}, + {3173, {wxStyledTextCtrl, replaceTarget, 1}}, + {3174, {wxStyledTextCtrl, searchInTarget, 1}}, + {3175, {wxStyledTextCtrl, setSearchFlags, 1}}, + {3176, {wxStyledTextCtrl, getSearchFlags, 0}}, + {3177, {wxStyledTextCtrl, callTipShow, 2}}, + {3178, {wxStyledTextCtrl, callTipCancel, 0}}, + {3179, {wxStyledTextCtrl, callTipActive, 0}}, + {3180, {wxStyledTextCtrl, callTipPosAtStart, 0}}, + {3181, {wxStyledTextCtrl, callTipSetHighlight, 2}}, + {3182, {wxStyledTextCtrl, callTipSetBackground, 1}}, + {3183, {wxStyledTextCtrl, callTipSetForeground, 1}}, + {3184, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}}, + {3185, {wxStyledTextCtrl, callTipUseStyle, 1}}, + {3186, {wxStyledTextCtrl, visibleFromDocLine, 1}}, + {3187, {wxStyledTextCtrl, docLineFromVisible, 1}}, + {3188, {wxStyledTextCtrl, wrapCount, 1}}, + {3189, {wxStyledTextCtrl, setFoldLevel, 2}}, + {3190, {wxStyledTextCtrl, getFoldLevel, 1}}, + {3191, {wxStyledTextCtrl, getLastChild, 2}}, + {3192, {wxStyledTextCtrl, getFoldParent, 1}}, + {3193, {wxStyledTextCtrl, showLines, 2}}, + {3194, {wxStyledTextCtrl, hideLines, 2}}, + {3195, {wxStyledTextCtrl, getLineVisible, 1}}, + {3196, {wxStyledTextCtrl, setFoldExpanded, 2}}, + {3197, {wxStyledTextCtrl, getFoldExpanded, 1}}, + {3198, {wxStyledTextCtrl, toggleFold, 1}}, + {3199, {wxStyledTextCtrl, ensureVisible, 1}}, + {3200, {wxStyledTextCtrl, setFoldFlags, 1}}, + {3201, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}}, + {3202, {wxStyledTextCtrl, setTabIndents, 1}}, + {3203, {wxStyledTextCtrl, getTabIndents, 0}}, + {3204, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}}, + {3205, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}}, + {3206, {wxStyledTextCtrl, setMouseDwellTime, 1}}, + {3207, {wxStyledTextCtrl, getMouseDwellTime, 0}}, + {3208, {wxStyledTextCtrl, wordStartPosition, 2}}, + {3209, {wxStyledTextCtrl, wordEndPosition, 2}}, + {3210, {wxStyledTextCtrl, setWrapMode, 1}}, + {3211, {wxStyledTextCtrl, getWrapMode, 0}}, + {3212, {wxStyledTextCtrl, setWrapVisualFlags, 1}}, + {3213, {wxStyledTextCtrl, getWrapVisualFlags, 0}}, + {3214, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}}, + {3215, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}}, + {3216, {wxStyledTextCtrl, setWrapStartIndent, 1}}, + {3217, {wxStyledTextCtrl, getWrapStartIndent, 0}}, + {3218, {wxStyledTextCtrl, setLayoutCache, 1}}, + {3219, {wxStyledTextCtrl, getLayoutCache, 0}}, + {3220, {wxStyledTextCtrl, setScrollWidth, 1}}, + {3221, {wxStyledTextCtrl, getScrollWidth, 0}}, + {3222, {wxStyledTextCtrl, textWidth, 2}}, + {3223, {wxStyledTextCtrl, getEndAtLastLine, 0}}, + {3224, {wxStyledTextCtrl, textHeight, 1}}, + {3225, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}}, + {3226, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}}, + {3227, {wxStyledTextCtrl, appendText, 1}}, + {3228, {wxStyledTextCtrl, getTwoPhaseDraw, 0}}, + {3229, {wxStyledTextCtrl, setTwoPhaseDraw, 1}}, + {3230, {wxStyledTextCtrl, targetFromSelection, 0}}, + {3231, {wxStyledTextCtrl, linesJoin, 0}}, + {3232, {wxStyledTextCtrl, linesSplit, 1}}, + {3233, {wxStyledTextCtrl, setFoldMarginColour, 2}}, + {3234, {wxStyledTextCtrl, setFoldMarginHiColour, 2}}, + {3235, {wxStyledTextCtrl, lineDown, 0}}, + {3236, {wxStyledTextCtrl, lineDownExtend, 0}}, + {3237, {wxStyledTextCtrl, lineUp, 0}}, + {3238, {wxStyledTextCtrl, lineUpExtend, 0}}, + {3239, {wxStyledTextCtrl, charLeft, 0}}, + {3240, {wxStyledTextCtrl, charLeftExtend, 0}}, + {3241, {wxStyledTextCtrl, charRight, 0}}, + {3242, {wxStyledTextCtrl, charRightExtend, 0}}, + {3243, {wxStyledTextCtrl, wordLeft, 0}}, + {3244, {wxStyledTextCtrl, wordLeftExtend, 0}}, + {3245, {wxStyledTextCtrl, wordRight, 0}}, + {3246, {wxStyledTextCtrl, wordRightExtend, 0}}, + {3247, {wxStyledTextCtrl, home, 0}}, + {3248, {wxStyledTextCtrl, homeExtend, 0}}, + {3249, {wxStyledTextCtrl, lineEnd, 0}}, + {3250, {wxStyledTextCtrl, lineEndExtend, 0}}, + {3251, {wxStyledTextCtrl, documentStart, 0}}, + {3252, {wxStyledTextCtrl, documentStartExtend, 0}}, + {3253, {wxStyledTextCtrl, documentEnd, 0}}, + {3254, {wxStyledTextCtrl, documentEndExtend, 0}}, + {3255, {wxStyledTextCtrl, pageUp, 0}}, + {3256, {wxStyledTextCtrl, pageUpExtend, 0}}, + {3257, {wxStyledTextCtrl, pageDown, 0}}, + {3258, {wxStyledTextCtrl, pageDownExtend, 0}}, + {3259, {wxStyledTextCtrl, editToggleOvertype, 0}}, + {3260, {wxStyledTextCtrl, cancel, 0}}, + {3261, {wxStyledTextCtrl, deleteBack, 0}}, + {3262, {wxStyledTextCtrl, tab, 0}}, + {3263, {wxStyledTextCtrl, backTab, 0}}, + {3264, {wxStyledTextCtrl, newLine, 0}}, + {3265, {wxStyledTextCtrl, formFeed, 0}}, + {3266, {wxStyledTextCtrl, vCHome, 0}}, + {3267, {wxStyledTextCtrl, vCHomeExtend, 0}}, + {3268, {wxStyledTextCtrl, zoomIn, 0}}, + {3269, {wxStyledTextCtrl, zoomOut, 0}}, + {3270, {wxStyledTextCtrl, delWordLeft, 0}}, + {3271, {wxStyledTextCtrl, delWordRight, 0}}, + {3272, {wxStyledTextCtrl, lineCut, 0}}, + {3273, {wxStyledTextCtrl, lineDelete, 0}}, + {3274, {wxStyledTextCtrl, lineTranspose, 0}}, + {3275, {wxStyledTextCtrl, lineDuplicate, 0}}, + {3276, {wxStyledTextCtrl, lowerCase, 0}}, + {3277, {wxStyledTextCtrl, upperCase, 0}}, + {3278, {wxStyledTextCtrl, lineScrollDown, 0}}, + {3279, {wxStyledTextCtrl, lineScrollUp, 0}}, + {3280, {wxStyledTextCtrl, deleteBackNotLine, 0}}, + {3281, {wxStyledTextCtrl, homeDisplay, 0}}, + {3282, {wxStyledTextCtrl, homeDisplayExtend, 0}}, + {3283, {wxStyledTextCtrl, lineEndDisplay, 0}}, + {3284, {wxStyledTextCtrl, lineEndDisplayExtend, 0}}, + {3285, {wxStyledTextCtrl, homeWrapExtend, 0}}, + {3286, {wxStyledTextCtrl, lineEndWrap, 0}}, + {3287, {wxStyledTextCtrl, lineEndWrapExtend, 0}}, + {3288, {wxStyledTextCtrl, vCHomeWrap, 0}}, + {3289, {wxStyledTextCtrl, vCHomeWrapExtend, 0}}, + {3290, {wxStyledTextCtrl, lineCopy, 0}}, + {3291, {wxStyledTextCtrl, moveCaretInsideView, 0}}, + {3292, {wxStyledTextCtrl, lineLength, 1}}, + {3293, {wxStyledTextCtrl, braceHighlight, 2}}, + {3294, {wxStyledTextCtrl, braceBadLight, 1}}, + {3295, {wxStyledTextCtrl, braceMatch, 1}}, + {3296, {wxStyledTextCtrl, getViewEOL, 0}}, + {3297, {wxStyledTextCtrl, setViewEOL, 1}}, + {3298, {wxStyledTextCtrl, setModEventMask, 1}}, + {3299, {wxStyledTextCtrl, getEdgeColumn, 0}}, + {3300, {wxStyledTextCtrl, setEdgeColumn, 1}}, + {3301, {wxStyledTextCtrl, setEdgeMode, 1}}, + {3302, {wxStyledTextCtrl, getEdgeMode, 0}}, + {3303, {wxStyledTextCtrl, getEdgeColour, 0}}, + {3304, {wxStyledTextCtrl, setEdgeColour, 1}}, + {3305, {wxStyledTextCtrl, searchAnchor, 0}}, + {3306, {wxStyledTextCtrl, searchNext, 2}}, + {3307, {wxStyledTextCtrl, searchPrev, 2}}, + {3308, {wxStyledTextCtrl, linesOnScreen, 0}}, + {3309, {wxStyledTextCtrl, usePopUp, 1}}, + {3310, {wxStyledTextCtrl, selectionIsRectangle, 0}}, + {3311, {wxStyledTextCtrl, setZoom, 1}}, + {3312, {wxStyledTextCtrl, getZoom, 0}}, + {3313, {wxStyledTextCtrl, getModEventMask, 0}}, + {3314, {wxStyledTextCtrl, setSTCFocus, 1}}, + {3315, {wxStyledTextCtrl, getSTCFocus, 0}}, + {3316, {wxStyledTextCtrl, setStatus, 1}}, + {3317, {wxStyledTextCtrl, getStatus, 0}}, + {3318, {wxStyledTextCtrl, setMouseDownCaptures, 1}}, + {3319, {wxStyledTextCtrl, getMouseDownCaptures, 0}}, + {3320, {wxStyledTextCtrl, setSTCCursor, 1}}, + {3321, {wxStyledTextCtrl, getSTCCursor, 0}}, + {3322, {wxStyledTextCtrl, setControlCharSymbol, 1}}, + {3323, {wxStyledTextCtrl, getControlCharSymbol, 0}}, + {3324, {wxStyledTextCtrl, wordPartLeft, 0}}, + {3325, {wxStyledTextCtrl, wordPartLeftExtend, 0}}, + {3326, {wxStyledTextCtrl, wordPartRight, 0}}, + {3327, {wxStyledTextCtrl, wordPartRightExtend, 0}}, + {3328, {wxStyledTextCtrl, setVisiblePolicy, 2}}, + {3329, {wxStyledTextCtrl, delLineLeft, 0}}, + {3330, {wxStyledTextCtrl, delLineRight, 0}}, + {3331, {wxStyledTextCtrl, getXOffset, 0}}, + {3332, {wxStyledTextCtrl, chooseCaretX, 0}}, + {3333, {wxStyledTextCtrl, setXCaretPolicy, 2}}, + {3334, {wxStyledTextCtrl, setYCaretPolicy, 2}}, + {3335, {wxStyledTextCtrl, getPrintWrapMode, 0}}, + {3336, {wxStyledTextCtrl, setHotspotActiveForeground, 2}}, + {3337, {wxStyledTextCtrl, setHotspotActiveBackground, 2}}, + {3338, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}}, + {3339, {wxStyledTextCtrl, setHotspotSingleLine, 1}}, + {3340, {wxStyledTextCtrl, paraDownExtend, 0}}, + {3341, {wxStyledTextCtrl, paraUp, 0}}, + {3342, {wxStyledTextCtrl, paraUpExtend, 0}}, + {3343, {wxStyledTextCtrl, positionBefore, 1}}, + {3344, {wxStyledTextCtrl, positionAfter, 1}}, + {3345, {wxStyledTextCtrl, copyRange, 2}}, + {3346, {wxStyledTextCtrl, copyText, 2}}, + {3347, {wxStyledTextCtrl, setSelectionMode, 1}}, + {3348, {wxStyledTextCtrl, getSelectionMode, 0}}, + {3349, {wxStyledTextCtrl, lineDownRectExtend, 0}}, + {3350, {wxStyledTextCtrl, lineUpRectExtend, 0}}, + {3351, {wxStyledTextCtrl, charLeftRectExtend, 0}}, + {3352, {wxStyledTextCtrl, charRightRectExtend, 0}}, + {3353, {wxStyledTextCtrl, homeRectExtend, 0}}, + {3354, {wxStyledTextCtrl, vCHomeRectExtend, 0}}, + {3355, {wxStyledTextCtrl, lineEndRectExtend, 0}}, + {3356, {wxStyledTextCtrl, pageUpRectExtend, 0}}, + {3357, {wxStyledTextCtrl, pageDownRectExtend, 0}}, + {3358, {wxStyledTextCtrl, stutteredPageUp, 0}}, + {3359, {wxStyledTextCtrl, stutteredPageUpExtend, 0}}, + {3360, {wxStyledTextCtrl, stutteredPageDown, 0}}, + {3361, {wxStyledTextCtrl, stutteredPageDownExtend, 0}}, + {3362, {wxStyledTextCtrl, wordLeftEnd, 0}}, + {3363, {wxStyledTextCtrl, wordLeftEndExtend, 0}}, + {3364, {wxStyledTextCtrl, wordRightEnd, 0}}, + {3365, {wxStyledTextCtrl, wordRightEndExtend, 0}}, + {3366, {wxStyledTextCtrl, setWhitespaceChars, 1}}, + {3367, {wxStyledTextCtrl, setCharsDefault, 0}}, + {3368, {wxStyledTextCtrl, autoCompGetCurrent, 0}}, + {3369, {wxStyledTextCtrl, allocate, 1}}, + {3370, {wxStyledTextCtrl, findColumn, 2}}, + {3371, {wxStyledTextCtrl, getCaretSticky, 0}}, + {3372, {wxStyledTextCtrl, setCaretSticky, 1}}, + {3373, {wxStyledTextCtrl, toggleCaretSticky, 0}}, + {3374, {wxStyledTextCtrl, setPasteConvertEndings, 1}}, + {3375, {wxStyledTextCtrl, getPasteConvertEndings, 0}}, + {3376, {wxStyledTextCtrl, selectionDuplicate, 0}}, + {3377, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}}, + {3378, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}}, + {3379, {wxStyledTextCtrl, startRecord, 0}}, + {3380, {wxStyledTextCtrl, stopRecord, 0}}, + {3381, {wxStyledTextCtrl, setLexer, 1}}, + {3382, {wxStyledTextCtrl, getLexer, 0}}, + {3383, {wxStyledTextCtrl, colourise, 2}}, + {3384, {wxStyledTextCtrl, setProperty, 2}}, + {3385, {wxStyledTextCtrl, setKeyWords, 2}}, + {3386, {wxStyledTextCtrl, setLexerLanguage, 1}}, + {3387, {wxStyledTextCtrl, getProperty, 1}}, + {3388, {wxStyledTextCtrl, getStyleBitsNeeded, 0}}, + {3389, {wxStyledTextCtrl, getCurrentLine, 0}}, + {3390, {wxStyledTextCtrl, styleSetSpec, 2}}, + {3391, {wxStyledTextCtrl, styleSetFont, 2}}, + {3392, {wxStyledTextCtrl, styleSetFontAttr, 7}}, + {3393, {wxStyledTextCtrl, styleSetCharacterSet, 2}}, + {3394, {wxStyledTextCtrl, styleSetFontEncoding, 2}}, + {3395, {wxStyledTextCtrl, cmdKeyExecute, 1}}, + {3396, {wxStyledTextCtrl, setMargins, 2}}, + {3397, {wxStyledTextCtrl, getSelection, 2}}, + {3398, {wxStyledTextCtrl, pointFromPosition, 1}}, + {3399, {wxStyledTextCtrl, scrollToLine, 1}}, + {3400, {wxStyledTextCtrl, scrollToColumn, 1}}, + {3401, {wxStyledTextCtrl, setVScrollBar, 1}}, + {3402, {wxStyledTextCtrl, setHScrollBar, 1}}, + {3403, {wxStyledTextCtrl, getLastKeydownProcessed, 0}}, + {3404, {wxStyledTextCtrl, setLastKeydownProcessed, 1}}, + {3405, {wxStyledTextCtrl, saveFile, 1}}, + {3406, {wxStyledTextCtrl, loadFile, 1}}, + {3407, {wxStyledTextCtrl, doDragOver, 3}}, + {3408, {wxStyledTextCtrl, doDropText, 3}}, + {3409, {wxStyledTextCtrl, getUseAntiAliasing, 0}}, + {3410, {wxStyledTextCtrl, addTextRaw, 1}}, + {3411, {wxStyledTextCtrl, insertTextRaw, 2}}, + {3412, {wxStyledTextCtrl, getCurLineRaw, 1}}, + {3413, {wxStyledTextCtrl, getLineRaw, 1}}, + {3414, {wxStyledTextCtrl, getSelectedTextRaw, 0}}, + {3415, {wxStyledTextCtrl, getTextRangeRaw, 2}}, + {3416, {wxStyledTextCtrl, setTextRaw, 1}}, + {3417, {wxStyledTextCtrl, getTextRaw, 0}}, + {3418, {wxStyledTextCtrl, appendTextRaw, 1}}, + {3419, {wxArtProvider, getBitmap, 2}}, + {3420, {wxArtProvider, getIcon, 2}}, + {3421, {wxTreeEvent, getKeyCode, 0}}, + {3422, {wxTreeEvent, getItem, 0}}, + {3423, {wxTreeEvent, getKeyEvent, 0}}, + {3424, {wxTreeEvent, getLabel, 0}}, + {3425, {wxTreeEvent, getOldItem, 0}}, + {3426, {wxTreeEvent, getPoint, 0}}, + {3427, {wxTreeEvent, isEditCancelled, 0}}, + {3428, {wxTreeEvent, setToolTip, 1}}, + {3429, {wxNotebookEvent, getOldSelection, 0}}, + {3430, {wxNotebookEvent, getSelection, 0}}, + {3431, {wxNotebookEvent, setOldSelection, 1}}, + {3432, {wxNotebookEvent, setSelection, 1}}, + {3433, {wxFileDataObject, new, 0}}, + {3434, {wxFileDataObject, addFile, 1}}, + {3435, {wxFileDataObject, getFilenames, 0}}, + {3436, {wxFileDataObject, 'Destroy', undefined}}, + {3437, {wxTextDataObject, new, 1}}, + {3438, {wxTextDataObject, getTextLength, 0}}, + {3439, {wxTextDataObject, getText, 0}}, + {3440, {wxTextDataObject, setText, 1}}, + {3441, {wxTextDataObject, 'Destroy', undefined}}, + {3442, {wxBitmapDataObject, new_1_1, 1}}, + {3443, {wxBitmapDataObject, new_1_0, 1}}, + {3444, {wxBitmapDataObject, getBitmap, 0}}, + {3445, {wxBitmapDataObject, setBitmap, 1}}, + {3446, {wxBitmapDataObject, 'Destroy', undefined}}, + {3448, {wxClipboard, new, 0}}, + {3449, {wxClipboard, destruct, 0}}, + {3450, {wxClipboard, addData, 1}}, + {3451, {wxClipboard, clear, 0}}, + {3452, {wxClipboard, close, 0}}, + {3453, {wxClipboard, flush, 0}}, + {3454, {wxClipboard, getData, 1}}, + {3455, {wxClipboard, isOpened, 0}}, + {3456, {wxClipboard, open, 0}}, + {3457, {wxClipboard, setData, 1}}, + {3459, {wxClipboard, usePrimarySelection, 1}}, + {3460, {wxClipboard, isSupported, 1}}, + {3461, {wxClipboard, get, 0}}, + {3462, {wxSpinEvent, getPosition, 0}}, + {3463, {wxSpinEvent, setPosition, 1}}, + {3464, {wxSplitterWindow, new_0, 0}}, + {3465, {wxSplitterWindow, new_2, 2}}, + {3466, {wxSplitterWindow, destruct, 0}}, + {3467, {wxSplitterWindow, create, 2}}, + {3468, {wxSplitterWindow, getMinimumPaneSize, 0}}, + {3469, {wxSplitterWindow, getSashGravity, 0}}, + {3470, {wxSplitterWindow, getSashPosition, 0}}, + {3471, {wxSplitterWindow, getSplitMode, 0}}, + {3472, {wxSplitterWindow, getWindow1, 0}}, + {3473, {wxSplitterWindow, getWindow2, 0}}, + {3474, {wxSplitterWindow, initialize, 1}}, + {3475, {wxSplitterWindow, isSplit, 0}}, + {3476, {wxSplitterWindow, replaceWindow, 2}}, + {3477, {wxSplitterWindow, setSashGravity, 1}}, + {3478, {wxSplitterWindow, setSashPosition, 2}}, + {3479, {wxSplitterWindow, setSashSize, 1}}, + {3480, {wxSplitterWindow, setMinimumPaneSize, 1}}, + {3481, {wxSplitterWindow, setSplitMode, 1}}, + {3482, {wxSplitterWindow, splitHorizontally, 3}}, + {3483, {wxSplitterWindow, splitVertically, 3}}, + {3484, {wxSplitterWindow, unsplit, 1}}, + {3485, {wxSplitterWindow, updateSize, 0}}, + {3486, {wxSplitterEvent, getSashPosition, 0}}, + {3487, {wxSplitterEvent, getX, 0}}, + {3488, {wxSplitterEvent, getY, 0}}, + {3489, {wxSplitterEvent, getWindowBeingRemoved, 0}}, + {3490, {wxSplitterEvent, setSashPosition, 1}}, + {3491, {wxHtmlWindow, new_0, 0}}, + {3492, {wxHtmlWindow, new_2, 2}}, + {3493, {wxHtmlWindow, appendToPage, 1}}, + {3494, {wxHtmlWindow, getOpenedAnchor, 0}}, + {3495, {wxHtmlWindow, getOpenedPage, 0}}, + {3496, {wxHtmlWindow, getOpenedPageTitle, 0}}, + {3497, {wxHtmlWindow, getRelatedFrame, 0}}, + {3498, {wxHtmlWindow, historyBack, 0}}, + {3499, {wxHtmlWindow, historyCanBack, 0}}, + {3500, {wxHtmlWindow, historyCanForward, 0}}, + {3501, {wxHtmlWindow, historyClear, 0}}, + {3502, {wxHtmlWindow, historyForward, 0}}, + {3503, {wxHtmlWindow, loadFile, 1}}, + {3504, {wxHtmlWindow, loadPage, 1}}, + {3505, {wxHtmlWindow, selectAll, 0}}, + {3506, {wxHtmlWindow, selectionToText, 0}}, + {3507, {wxHtmlWindow, selectLine, 1}}, + {3508, {wxHtmlWindow, selectWord, 1}}, + {3509, {wxHtmlWindow, setBorders, 1}}, + {3510, {wxHtmlWindow, setFonts, 3}}, + {3511, {wxHtmlWindow, setPage, 1}}, + {3512, {wxHtmlWindow, setRelatedFrame, 2}}, + {3513, {wxHtmlWindow, setRelatedStatusBar, 1}}, + {3514, {wxHtmlWindow, toText, 0}}, + {3515, {wxHtmlWindow, 'Destroy', undefined}}, + {3516, {wxHtmlLinkEvent, getLinkInfo, 0}}, + {3517, {wxSystemSettings, getColour, 1}}, + {3518, {wxSystemSettings, getFont, 1}}, + {3519, {wxSystemSettings, getMetric, 2}}, + {3520, {wxSystemSettings, getScreenType, 0}}, + {3521, {wxSystemOptions, getOption, 1}}, + {3522, {wxSystemOptions, getOptionInt, 1}}, + {3523, {wxSystemOptions, hasOption, 1}}, + {3524, {wxSystemOptions, isFalse, 1}}, + {3525, {wxSystemOptions, setOption_2_1, 2}}, + {3526, {wxSystemOptions, setOption_2_0, 2}}, + {3527, {wxAuiNotebookEvent, setSelection, 1}}, + {3528, {wxAuiNotebookEvent, getSelection, 0}}, + {3529, {wxAuiNotebookEvent, setOldSelection, 1}}, + {3530, {wxAuiNotebookEvent, getOldSelection, 0}}, + {3531, {wxAuiNotebookEvent, setDragSource, 1}}, + {3532, {wxAuiNotebookEvent, getDragSource, 0}}, + {3533, {wxAuiManagerEvent, setManager, 1}}, + {3534, {wxAuiManagerEvent, getManager, 0}}, + {3535, {wxAuiManagerEvent, setPane, 1}}, + {3536, {wxAuiManagerEvent, getPane, 0}}, + {3537, {wxAuiManagerEvent, setButton, 1}}, + {3538, {wxAuiManagerEvent, getButton, 0}}, + {3539, {wxAuiManagerEvent, setDC, 1}}, + {3540, {wxAuiManagerEvent, getDC, 0}}, + {3541, {wxAuiManagerEvent, veto, 1}}, + {3542, {wxAuiManagerEvent, getVeto, 0}}, + {3543, {wxAuiManagerEvent, setCanVeto, 1}}, + {3544, {wxAuiManagerEvent, canVeto, 0}}, + {3545, {wxLogNull, new, 0}}, + {3546, {wxLogNull, 'Destroy', undefined}}, + {3547, {wxTaskBarIcon, new, 0}}, + {3548, {wxTaskBarIcon, destruct, 0}}, + {3549, {wxTaskBarIcon, popupMenu, 1}}, + {3550, {wxTaskBarIcon, removeIcon, 0}}, + {3551, {wxTaskBarIcon, setIcon, 2}}, + {3552, {wxLocale, new_0, 0}}, + {3554, {wxLocale, new_2, 2}}, + {3555, {wxLocale, destruct, 0}}, + {3557, {wxLocale, init, 1}}, + {3558, {wxLocale, addCatalog_1, 1}}, + {3559, {wxLocale, addCatalog_3, 3}}, + {3560, {wxLocale, addCatalogLookupPathPrefix, 1}}, + {3561, {wxLocale, getCanonicalName, 0}}, + {3562, {wxLocale, getLanguage, 0}}, + {3563, {wxLocale, getLanguageName, 1}}, + {3564, {wxLocale, getLocale, 0}}, + {3565, {wxLocale, getName, 0}}, + {3566, {wxLocale, getString_2, 2}}, + {3567, {wxLocale, getString_4, 4}}, + {3568, {wxLocale, getHeaderValue, 2}}, + {3569, {wxLocale, getSysName, 0}}, + {3570, {wxLocale, getSystemEncoding, 0}}, + {3571, {wxLocale, getSystemEncodingName, 0}}, + {3572, {wxLocale, getSystemLanguage, 0}}, + {3573, {wxLocale, isLoaded, 1}}, + {3574, {wxLocale, isOk, 0}}, + {3575, {wxActivateEvent, getActive, 0}}, + {3577, {wxPopupWindow, new_2, 2}}, + {3578, {wxPopupWindow, new_0, 0}}, + {3580, {wxPopupWindow, destruct, 0}}, + {3581, {wxPopupWindow, create, 2}}, + {3582, {wxPopupWindow, position, 2}}, + {3583, {wxPopupTransientWindow, new_0, 0}}, + {3584, {wxPopupTransientWindow, new_2, 2}}, + {3585, {wxPopupTransientWindow, destruct, 0}}, + {3586, {wxPopupTransientWindow, popup, 1}}, + {3587, {wxPopupTransientWindow, dismiss, 0}}, + {3588, {wxOverlay, new, 0}}, + {3589, {wxOverlay, destruct, 0}}, + {3590, {wxOverlay, reset, 0}}, + {3591, {wxDCOverlay, new_6, 6}}, + {3592, {wxDCOverlay, new_2, 2}}, + {3593, {wxDCOverlay, destruct, 0}}, + {3594, {wxDCOverlay, clear, 0}}, {-1, {mod, func, -1}} ]. diff --git a/lib/wx/src/gen/wxe_funcs.hrl b/lib/wx/src/gen/wxe_funcs.hrl index f5f839ac67..84fa592aaa 100644 --- a/lib/wx/src/gen/wxe_funcs.hrl +++ b/lib/wx/src/gen/wxe_funcs.hrl @@ -1454,1922 +1454,1918 @@ -define(wxGauge_new_0, 1602). -define(wxGauge_new_4, 1603). -define(wxGauge_Create, 1604). --define(wxGauge_GetBezelFace, 1605). --define(wxGauge_GetRange, 1606). --define(wxGauge_GetShadowWidth, 1607). --define(wxGauge_GetValue, 1608). --define(wxGauge_IsVertical, 1609). --define(wxGauge_SetBezelFace, 1610). --define(wxGauge_SetRange, 1611). --define(wxGauge_SetShadowWidth, 1612). --define(wxGauge_SetValue, 1613). --define(wxGauge_Pulse, 1614). --define(wxGauge_destroy, 1615). --define(wxGenericDirCtrl_new_0, 1616). --define(wxGenericDirCtrl_new_2, 1617). --define(wxGenericDirCtrl_destruct, 1618). --define(wxGenericDirCtrl_Create, 1619). --define(wxGenericDirCtrl_Init, 1620). --define(wxGenericDirCtrl_CollapseTree, 1621). --define(wxGenericDirCtrl_ExpandPath, 1622). --define(wxGenericDirCtrl_GetDefaultPath, 1623). --define(wxGenericDirCtrl_GetPath, 1624). --define(wxGenericDirCtrl_GetFilePath, 1625). --define(wxGenericDirCtrl_GetFilter, 1626). --define(wxGenericDirCtrl_GetFilterIndex, 1627). --define(wxGenericDirCtrl_GetRootId, 1628). --define(wxGenericDirCtrl_GetTreeCtrl, 1629). --define(wxGenericDirCtrl_ReCreateTree, 1630). --define(wxGenericDirCtrl_SetDefaultPath, 1631). --define(wxGenericDirCtrl_SetFilter, 1632). --define(wxGenericDirCtrl_SetFilterIndex, 1633). --define(wxGenericDirCtrl_SetPath, 1634). --define(wxStaticBox_new_4, 1636). --define(wxStaticBox_new_0, 1637). --define(wxStaticBox_Create, 1638). --define(wxStaticBox_destroy, 1639). --define(wxStaticLine_new_2, 1641). --define(wxStaticLine_new_0, 1642). --define(wxStaticLine_Create, 1643). --define(wxStaticLine_IsVertical, 1644). --define(wxStaticLine_GetDefaultSize, 1645). --define(wxStaticLine_destroy, 1646). --define(wxListBox_new_3, 1649). --define(wxListBox_new_0, 1650). --define(wxListBox_destruct, 1652). --define(wxListBox_Create, 1654). --define(wxListBox_Deselect, 1655). --define(wxListBox_GetSelections, 1656). --define(wxListBox_InsertItems, 1657). --define(wxListBox_IsSelected, 1658). --define(wxListBox_Set, 1659). --define(wxListBox_HitTest, 1660). --define(wxListBox_SetFirstItem_1_0, 1661). --define(wxListBox_SetFirstItem_1_1, 1662). --define(wxListCtrl_new_0, 1663). --define(wxListCtrl_new_2, 1664). --define(wxListCtrl_Arrange, 1665). --define(wxListCtrl_AssignImageList, 1666). --define(wxListCtrl_ClearAll, 1667). --define(wxListCtrl_Create, 1668). --define(wxListCtrl_DeleteAllItems, 1669). --define(wxListCtrl_DeleteColumn, 1670). --define(wxListCtrl_DeleteItem, 1671). --define(wxListCtrl_EditLabel, 1672). --define(wxListCtrl_EnsureVisible, 1673). --define(wxListCtrl_FindItem_3_0, 1674). --define(wxListCtrl_FindItem_3_1, 1675). --define(wxListCtrl_GetColumn, 1676). --define(wxListCtrl_GetColumnCount, 1677). --define(wxListCtrl_GetColumnWidth, 1678). --define(wxListCtrl_GetCountPerPage, 1679). --define(wxListCtrl_GetEditControl, 1680). --define(wxListCtrl_GetImageList, 1681). --define(wxListCtrl_GetItem, 1682). --define(wxListCtrl_GetItemBackgroundColour, 1683). --define(wxListCtrl_GetItemCount, 1684). --define(wxListCtrl_GetItemData, 1685). --define(wxListCtrl_GetItemFont, 1686). --define(wxListCtrl_GetItemPosition, 1687). --define(wxListCtrl_GetItemRect, 1688). --define(wxListCtrl_GetItemSpacing, 1689). --define(wxListCtrl_GetItemState, 1690). --define(wxListCtrl_GetItemText, 1691). --define(wxListCtrl_GetItemTextColour, 1692). --define(wxListCtrl_GetNextItem, 1693). --define(wxListCtrl_GetSelectedItemCount, 1694). --define(wxListCtrl_GetTextColour, 1695). --define(wxListCtrl_GetTopItem, 1696). --define(wxListCtrl_GetViewRect, 1697). --define(wxListCtrl_HitTest, 1698). --define(wxListCtrl_InsertColumn_2, 1699). --define(wxListCtrl_InsertColumn_3, 1700). --define(wxListCtrl_InsertItem_1, 1701). --define(wxListCtrl_InsertItem_2_1, 1702). --define(wxListCtrl_InsertItem_2_0, 1703). --define(wxListCtrl_InsertItem_3, 1704). --define(wxListCtrl_RefreshItem, 1705). --define(wxListCtrl_RefreshItems, 1706). --define(wxListCtrl_ScrollList, 1707). --define(wxListCtrl_SetBackgroundColour, 1708). --define(wxListCtrl_SetColumn, 1709). --define(wxListCtrl_SetColumnWidth, 1710). --define(wxListCtrl_SetImageList, 1711). --define(wxListCtrl_SetItem_1, 1712). --define(wxListCtrl_SetItem_4, 1713). --define(wxListCtrl_SetItemBackgroundColour, 1714). --define(wxListCtrl_SetItemCount, 1715). --define(wxListCtrl_SetItemData, 1716). --define(wxListCtrl_SetItemFont, 1717). --define(wxListCtrl_SetItemImage, 1718). --define(wxListCtrl_SetItemColumnImage, 1719). --define(wxListCtrl_SetItemPosition, 1720). --define(wxListCtrl_SetItemState, 1721). --define(wxListCtrl_SetItemText, 1722). --define(wxListCtrl_SetItemTextColour, 1723). --define(wxListCtrl_SetSingleStyle, 1724). --define(wxListCtrl_SetTextColour, 1725). --define(wxListCtrl_SetWindowStyleFlag, 1726). --define(wxListCtrl_SortItems, 1727). --define(wxListCtrl_destroy, 1728). --define(wxListView_ClearColumnImage, 1729). --define(wxListView_Focus, 1730). --define(wxListView_GetFirstSelected, 1731). --define(wxListView_GetFocusedItem, 1732). --define(wxListView_GetNextSelected, 1733). --define(wxListView_IsSelected, 1734). --define(wxListView_Select, 1735). --define(wxListView_SetColumnImage, 1736). --define(wxListItem_new_0, 1737). --define(wxListItem_new_1, 1738). --define(wxListItem_destruct, 1739). --define(wxListItem_Clear, 1740). --define(wxListItem_GetAlign, 1741). --define(wxListItem_GetBackgroundColour, 1742). --define(wxListItem_GetColumn, 1743). --define(wxListItem_GetFont, 1744). --define(wxListItem_GetId, 1745). --define(wxListItem_GetImage, 1746). --define(wxListItem_GetMask, 1747). --define(wxListItem_GetState, 1748). --define(wxListItem_GetText, 1749). --define(wxListItem_GetTextColour, 1750). --define(wxListItem_GetWidth, 1751). --define(wxListItem_SetAlign, 1752). --define(wxListItem_SetBackgroundColour, 1753). --define(wxListItem_SetColumn, 1754). --define(wxListItem_SetFont, 1755). --define(wxListItem_SetId, 1756). --define(wxListItem_SetImage, 1757). --define(wxListItem_SetMask, 1758). --define(wxListItem_SetState, 1759). --define(wxListItem_SetStateMask, 1760). --define(wxListItem_SetText, 1761). --define(wxListItem_SetTextColour, 1762). --define(wxListItem_SetWidth, 1763). --define(wxListItemAttr_new_0, 1764). --define(wxListItemAttr_new_3, 1765). --define(wxListItemAttr_GetBackgroundColour, 1766). --define(wxListItemAttr_GetFont, 1767). --define(wxListItemAttr_GetTextColour, 1768). --define(wxListItemAttr_HasBackgroundColour, 1769). --define(wxListItemAttr_HasFont, 1770). --define(wxListItemAttr_HasTextColour, 1771). --define(wxListItemAttr_SetBackgroundColour, 1772). --define(wxListItemAttr_SetFont, 1773). --define(wxListItemAttr_SetTextColour, 1774). --define(wxListItemAttr_destroy, 1775). --define(wxImageList_new_0, 1776). --define(wxImageList_new_3, 1777). --define(wxImageList_Add_1, 1778). --define(wxImageList_Add_2_0, 1779). --define(wxImageList_Add_2_1, 1780). --define(wxImageList_Create, 1781). --define(wxImageList_Draw, 1783). --define(wxImageList_GetBitmap, 1784). --define(wxImageList_GetIcon, 1785). --define(wxImageList_GetImageCount, 1786). --define(wxImageList_GetSize, 1787). --define(wxImageList_Remove, 1788). --define(wxImageList_RemoveAll, 1789). --define(wxImageList_Replace_2, 1790). --define(wxImageList_Replace_3, 1791). --define(wxImageList_destroy, 1792). --define(wxTextAttr_new_0, 1793). --define(wxTextAttr_new_2, 1794). --define(wxTextAttr_GetAlignment, 1795). --define(wxTextAttr_GetBackgroundColour, 1796). --define(wxTextAttr_GetFont, 1797). --define(wxTextAttr_GetLeftIndent, 1798). --define(wxTextAttr_GetLeftSubIndent, 1799). --define(wxTextAttr_GetRightIndent, 1800). --define(wxTextAttr_GetTabs, 1801). --define(wxTextAttr_GetTextColour, 1802). --define(wxTextAttr_HasBackgroundColour, 1803). --define(wxTextAttr_HasFont, 1804). --define(wxTextAttr_HasTextColour, 1805). --define(wxTextAttr_GetFlags, 1806). --define(wxTextAttr_IsDefault, 1807). --define(wxTextAttr_SetAlignment, 1808). --define(wxTextAttr_SetBackgroundColour, 1809). --define(wxTextAttr_SetFlags, 1810). --define(wxTextAttr_SetFont, 1811). --define(wxTextAttr_SetLeftIndent, 1812). --define(wxTextAttr_SetRightIndent, 1813). --define(wxTextAttr_SetTabs, 1814). --define(wxTextAttr_SetTextColour, 1815). --define(wxTextAttr_destroy, 1816). --define(wxTextCtrl_new_3, 1818). --define(wxTextCtrl_new_0, 1819). --define(wxTextCtrl_destruct, 1821). --define(wxTextCtrl_AppendText, 1822). --define(wxTextCtrl_CanCopy, 1823). --define(wxTextCtrl_CanCut, 1824). --define(wxTextCtrl_CanPaste, 1825). --define(wxTextCtrl_CanRedo, 1826). --define(wxTextCtrl_CanUndo, 1827). --define(wxTextCtrl_Clear, 1828). --define(wxTextCtrl_Copy, 1829). --define(wxTextCtrl_Create, 1830). --define(wxTextCtrl_Cut, 1831). --define(wxTextCtrl_DiscardEdits, 1832). --define(wxTextCtrl_ChangeValue, 1833). --define(wxTextCtrl_EmulateKeyPress, 1834). --define(wxTextCtrl_GetDefaultStyle, 1835). --define(wxTextCtrl_GetInsertionPoint, 1836). --define(wxTextCtrl_GetLastPosition, 1837). --define(wxTextCtrl_GetLineLength, 1838). --define(wxTextCtrl_GetLineText, 1839). --define(wxTextCtrl_GetNumberOfLines, 1840). --define(wxTextCtrl_GetRange, 1841). --define(wxTextCtrl_GetSelection, 1842). --define(wxTextCtrl_GetStringSelection, 1843). --define(wxTextCtrl_GetStyle, 1844). --define(wxTextCtrl_GetValue, 1845). --define(wxTextCtrl_IsEditable, 1846). --define(wxTextCtrl_IsModified, 1847). --define(wxTextCtrl_IsMultiLine, 1848). --define(wxTextCtrl_IsSingleLine, 1849). --define(wxTextCtrl_LoadFile, 1850). --define(wxTextCtrl_MarkDirty, 1851). --define(wxTextCtrl_Paste, 1852). --define(wxTextCtrl_PositionToXY, 1853). --define(wxTextCtrl_Redo, 1854). --define(wxTextCtrl_Remove, 1855). --define(wxTextCtrl_Replace, 1856). --define(wxTextCtrl_SaveFile, 1857). --define(wxTextCtrl_SetDefaultStyle, 1858). --define(wxTextCtrl_SetEditable, 1859). --define(wxTextCtrl_SetInsertionPoint, 1860). --define(wxTextCtrl_SetInsertionPointEnd, 1861). --define(wxTextCtrl_SetMaxLength, 1863). --define(wxTextCtrl_SetSelection, 1864). --define(wxTextCtrl_SetStyle, 1865). --define(wxTextCtrl_SetValue, 1866). --define(wxTextCtrl_ShowPosition, 1867). --define(wxTextCtrl_Undo, 1868). --define(wxTextCtrl_WriteText, 1869). --define(wxTextCtrl_XYToPosition, 1870). --define(wxNotebook_new_0, 1873). --define(wxNotebook_new_3, 1874). --define(wxNotebook_destruct, 1875). --define(wxNotebook_AddPage, 1876). --define(wxNotebook_AdvanceSelection, 1877). --define(wxNotebook_AssignImageList, 1878). --define(wxNotebook_Create, 1879). --define(wxNotebook_DeleteAllPages, 1880). --define(wxNotebook_DeletePage, 1881). --define(wxNotebook_RemovePage, 1882). --define(wxNotebook_GetCurrentPage, 1883). --define(wxNotebook_GetImageList, 1884). --define(wxNotebook_GetPage, 1886). --define(wxNotebook_GetPageCount, 1887). --define(wxNotebook_GetPageImage, 1888). --define(wxNotebook_GetPageText, 1889). --define(wxNotebook_GetRowCount, 1890). --define(wxNotebook_GetSelection, 1891). --define(wxNotebook_GetThemeBackgroundColour, 1892). --define(wxNotebook_HitTest, 1894). --define(wxNotebook_InsertPage, 1896). --define(wxNotebook_SetImageList, 1897). --define(wxNotebook_SetPadding, 1898). --define(wxNotebook_SetPageSize, 1899). --define(wxNotebook_SetPageImage, 1900). --define(wxNotebook_SetPageText, 1901). --define(wxNotebook_SetSelection, 1902). --define(wxNotebook_ChangeSelection, 1903). --define(wxChoicebook_new_0, 1904). --define(wxChoicebook_new_3, 1905). --define(wxChoicebook_AddPage, 1906). --define(wxChoicebook_AdvanceSelection, 1907). --define(wxChoicebook_AssignImageList, 1908). --define(wxChoicebook_Create, 1909). --define(wxChoicebook_DeleteAllPages, 1910). --define(wxChoicebook_DeletePage, 1911). --define(wxChoicebook_RemovePage, 1912). --define(wxChoicebook_GetCurrentPage, 1913). --define(wxChoicebook_GetImageList, 1914). --define(wxChoicebook_GetPage, 1916). --define(wxChoicebook_GetPageCount, 1917). --define(wxChoicebook_GetPageImage, 1918). --define(wxChoicebook_GetPageText, 1919). --define(wxChoicebook_GetSelection, 1920). --define(wxChoicebook_HitTest, 1921). --define(wxChoicebook_InsertPage, 1922). --define(wxChoicebook_SetImageList, 1923). --define(wxChoicebook_SetPageSize, 1924). --define(wxChoicebook_SetPageImage, 1925). --define(wxChoicebook_SetPageText, 1926). --define(wxChoicebook_SetSelection, 1927). --define(wxChoicebook_ChangeSelection, 1928). --define(wxChoicebook_destroy, 1929). --define(wxToolbook_new_0, 1930). --define(wxToolbook_new_3, 1931). --define(wxToolbook_AddPage, 1932). --define(wxToolbook_AdvanceSelection, 1933). --define(wxToolbook_AssignImageList, 1934). --define(wxToolbook_Create, 1935). --define(wxToolbook_DeleteAllPages, 1936). --define(wxToolbook_DeletePage, 1937). --define(wxToolbook_RemovePage, 1938). --define(wxToolbook_GetCurrentPage, 1939). --define(wxToolbook_GetImageList, 1940). --define(wxToolbook_GetPage, 1942). --define(wxToolbook_GetPageCount, 1943). --define(wxToolbook_GetPageImage, 1944). --define(wxToolbook_GetPageText, 1945). --define(wxToolbook_GetSelection, 1946). --define(wxToolbook_HitTest, 1948). --define(wxToolbook_InsertPage, 1949). --define(wxToolbook_SetImageList, 1950). --define(wxToolbook_SetPageSize, 1951). --define(wxToolbook_SetPageImage, 1952). --define(wxToolbook_SetPageText, 1953). --define(wxToolbook_SetSelection, 1954). --define(wxToolbook_ChangeSelection, 1955). --define(wxToolbook_destroy, 1956). --define(wxListbook_new_0, 1957). --define(wxListbook_new_3, 1958). --define(wxListbook_AddPage, 1959). --define(wxListbook_AdvanceSelection, 1960). --define(wxListbook_AssignImageList, 1961). --define(wxListbook_Create, 1962). --define(wxListbook_DeleteAllPages, 1963). --define(wxListbook_DeletePage, 1964). --define(wxListbook_RemovePage, 1965). --define(wxListbook_GetCurrentPage, 1966). --define(wxListbook_GetImageList, 1967). --define(wxListbook_GetPage, 1969). --define(wxListbook_GetPageCount, 1970). --define(wxListbook_GetPageImage, 1971). --define(wxListbook_GetPageText, 1972). --define(wxListbook_GetSelection, 1973). --define(wxListbook_HitTest, 1975). --define(wxListbook_InsertPage, 1976). --define(wxListbook_SetImageList, 1977). --define(wxListbook_SetPageSize, 1978). --define(wxListbook_SetPageImage, 1979). --define(wxListbook_SetPageText, 1980). --define(wxListbook_SetSelection, 1981). --define(wxListbook_ChangeSelection, 1982). --define(wxListbook_destroy, 1983). --define(wxTreebook_new_0, 1984). --define(wxTreebook_new_3, 1985). --define(wxTreebook_AddPage, 1986). --define(wxTreebook_AdvanceSelection, 1987). --define(wxTreebook_AssignImageList, 1988). --define(wxTreebook_Create, 1989). --define(wxTreebook_DeleteAllPages, 1990). --define(wxTreebook_DeletePage, 1991). --define(wxTreebook_RemovePage, 1992). --define(wxTreebook_GetCurrentPage, 1993). --define(wxTreebook_GetImageList, 1994). --define(wxTreebook_GetPage, 1996). --define(wxTreebook_GetPageCount, 1997). --define(wxTreebook_GetPageImage, 1998). --define(wxTreebook_GetPageText, 1999). --define(wxTreebook_GetSelection, 2000). --define(wxTreebook_ExpandNode, 2001). --define(wxTreebook_IsNodeExpanded, 2002). --define(wxTreebook_HitTest, 2004). --define(wxTreebook_InsertPage, 2005). --define(wxTreebook_InsertSubPage, 2006). --define(wxTreebook_SetImageList, 2007). --define(wxTreebook_SetPageSize, 2008). --define(wxTreebook_SetPageImage, 2009). --define(wxTreebook_SetPageText, 2010). --define(wxTreebook_SetSelection, 2011). --define(wxTreebook_ChangeSelection, 2012). --define(wxTreebook_destroy, 2013). --define(wxTreeCtrl_new_2, 2016). --define(wxTreeCtrl_new_0, 2017). --define(wxTreeCtrl_destruct, 2019). --define(wxTreeCtrl_AddRoot, 2020). --define(wxTreeCtrl_AppendItem, 2021). --define(wxTreeCtrl_AssignImageList, 2022). --define(wxTreeCtrl_AssignStateImageList, 2023). --define(wxTreeCtrl_Collapse, 2024). --define(wxTreeCtrl_CollapseAndReset, 2025). --define(wxTreeCtrl_Create, 2026). --define(wxTreeCtrl_Delete, 2027). --define(wxTreeCtrl_DeleteAllItems, 2028). --define(wxTreeCtrl_DeleteChildren, 2029). --define(wxTreeCtrl_EditLabel, 2030). --define(wxTreeCtrl_EnsureVisible, 2031). --define(wxTreeCtrl_Expand, 2032). --define(wxTreeCtrl_GetBoundingRect, 2033). --define(wxTreeCtrl_GetChildrenCount, 2035). --define(wxTreeCtrl_GetCount, 2036). --define(wxTreeCtrl_GetEditControl, 2037). --define(wxTreeCtrl_GetFirstChild, 2038). --define(wxTreeCtrl_GetNextChild, 2039). --define(wxTreeCtrl_GetFirstVisibleItem, 2040). --define(wxTreeCtrl_GetImageList, 2041). --define(wxTreeCtrl_GetIndent, 2042). --define(wxTreeCtrl_GetItemBackgroundColour, 2043). --define(wxTreeCtrl_GetItemData, 2044). --define(wxTreeCtrl_GetItemFont, 2045). --define(wxTreeCtrl_GetItemImage_1, 2046). --define(wxTreeCtrl_GetItemImage_2, 2047). --define(wxTreeCtrl_GetItemText, 2048). --define(wxTreeCtrl_GetItemTextColour, 2049). --define(wxTreeCtrl_GetLastChild, 2050). --define(wxTreeCtrl_GetNextSibling, 2051). --define(wxTreeCtrl_GetNextVisible, 2052). --define(wxTreeCtrl_GetItemParent, 2053). --define(wxTreeCtrl_GetPrevSibling, 2054). --define(wxTreeCtrl_GetPrevVisible, 2055). --define(wxTreeCtrl_GetRootItem, 2056). --define(wxTreeCtrl_GetSelection, 2057). --define(wxTreeCtrl_GetSelections, 2058). --define(wxTreeCtrl_GetStateImageList, 2059). --define(wxTreeCtrl_HitTest, 2060). --define(wxTreeCtrl_InsertItem, 2062). --define(wxTreeCtrl_IsBold, 2063). --define(wxTreeCtrl_IsExpanded, 2064). --define(wxTreeCtrl_IsSelected, 2065). --define(wxTreeCtrl_IsVisible, 2066). --define(wxTreeCtrl_ItemHasChildren, 2067). --define(wxTreeCtrl_IsTreeItemIdOk, 2068). --define(wxTreeCtrl_PrependItem, 2069). --define(wxTreeCtrl_ScrollTo, 2070). --define(wxTreeCtrl_SelectItem_1, 2071). --define(wxTreeCtrl_SelectItem_2, 2072). --define(wxTreeCtrl_SetIndent, 2073). --define(wxTreeCtrl_SetImageList, 2074). --define(wxTreeCtrl_SetItemBackgroundColour, 2075). --define(wxTreeCtrl_SetItemBold, 2076). --define(wxTreeCtrl_SetItemData, 2077). --define(wxTreeCtrl_SetItemDropHighlight, 2078). --define(wxTreeCtrl_SetItemFont, 2079). --define(wxTreeCtrl_SetItemHasChildren, 2080). --define(wxTreeCtrl_SetItemImage_2, 2081). --define(wxTreeCtrl_SetItemImage_3, 2082). --define(wxTreeCtrl_SetItemText, 2083). --define(wxTreeCtrl_SetItemTextColour, 2084). --define(wxTreeCtrl_SetStateImageList, 2085). --define(wxTreeCtrl_SetWindowStyle, 2086). --define(wxTreeCtrl_SortChildren, 2087). --define(wxTreeCtrl_Toggle, 2088). --define(wxTreeCtrl_ToggleItemSelection, 2089). --define(wxTreeCtrl_Unselect, 2090). --define(wxTreeCtrl_UnselectAll, 2091). --define(wxTreeCtrl_UnselectItem, 2092). --define(wxScrollBar_new_0, 2093). --define(wxScrollBar_new_3, 2094). --define(wxScrollBar_destruct, 2095). --define(wxScrollBar_Create, 2096). --define(wxScrollBar_GetRange, 2097). --define(wxScrollBar_GetPageSize, 2098). --define(wxScrollBar_GetThumbPosition, 2099). --define(wxScrollBar_GetThumbSize, 2100). --define(wxScrollBar_SetThumbPosition, 2101). --define(wxScrollBar_SetScrollbar, 2102). --define(wxSpinButton_new_2, 2104). --define(wxSpinButton_new_0, 2105). --define(wxSpinButton_Create, 2106). --define(wxSpinButton_GetMax, 2107). --define(wxSpinButton_GetMin, 2108). --define(wxSpinButton_GetValue, 2109). --define(wxSpinButton_SetRange, 2110). --define(wxSpinButton_SetValue, 2111). --define(wxSpinButton_destroy, 2112). --define(wxSpinCtrl_new_0, 2113). --define(wxSpinCtrl_new_2, 2114). --define(wxSpinCtrl_Create, 2116). --define(wxSpinCtrl_SetValue_1_1, 2119). --define(wxSpinCtrl_SetValue_1_0, 2120). --define(wxSpinCtrl_GetValue, 2122). --define(wxSpinCtrl_SetRange, 2124). --define(wxSpinCtrl_SetSelection, 2125). --define(wxSpinCtrl_GetMin, 2127). --define(wxSpinCtrl_GetMax, 2129). --define(wxSpinCtrl_destroy, 2130). --define(wxStaticText_new_0, 2131). --define(wxStaticText_new_4, 2132). --define(wxStaticText_Create, 2133). --define(wxStaticText_GetLabel, 2134). --define(wxStaticText_SetLabel, 2135). --define(wxStaticText_Wrap, 2136). --define(wxStaticText_destroy, 2137). --define(wxStaticBitmap_new_0, 2138). --define(wxStaticBitmap_new_4, 2139). --define(wxStaticBitmap_Create, 2140). --define(wxStaticBitmap_GetBitmap, 2141). --define(wxStaticBitmap_SetBitmap, 2142). --define(wxStaticBitmap_destroy, 2143). --define(wxRadioBox_new, 2144). --define(wxRadioBox_destruct, 2146). --define(wxRadioBox_Create, 2147). --define(wxRadioBox_Enable_2, 2148). --define(wxRadioBox_Enable_1, 2149). --define(wxRadioBox_GetSelection, 2150). --define(wxRadioBox_GetString, 2151). --define(wxRadioBox_SetSelection, 2152). --define(wxRadioBox_Show_2, 2153). --define(wxRadioBox_Show_1, 2154). --define(wxRadioBox_GetColumnCount, 2155). --define(wxRadioBox_GetItemHelpText, 2156). --define(wxRadioBox_GetItemToolTip, 2157). --define(wxRadioBox_GetItemFromPoint, 2159). --define(wxRadioBox_GetRowCount, 2160). --define(wxRadioBox_IsItemEnabled, 2161). --define(wxRadioBox_IsItemShown, 2162). --define(wxRadioBox_SetItemHelpText, 2163). --define(wxRadioBox_SetItemToolTip, 2164). --define(wxRadioButton_new_0, 2165). --define(wxRadioButton_new_4, 2166). --define(wxRadioButton_Create, 2167). --define(wxRadioButton_GetValue, 2168). --define(wxRadioButton_SetValue, 2169). --define(wxRadioButton_destroy, 2170). --define(wxSlider_new_6, 2172). --define(wxSlider_new_0, 2173). --define(wxSlider_Create, 2174). --define(wxSlider_GetLineSize, 2175). --define(wxSlider_GetMax, 2176). --define(wxSlider_GetMin, 2177). --define(wxSlider_GetPageSize, 2178). --define(wxSlider_GetThumbLength, 2179). --define(wxSlider_GetValue, 2180). --define(wxSlider_SetLineSize, 2181). --define(wxSlider_SetPageSize, 2182). --define(wxSlider_SetRange, 2183). --define(wxSlider_SetThumbLength, 2184). --define(wxSlider_SetValue, 2185). --define(wxSlider_destroy, 2186). --define(wxDialog_new_4, 2188). --define(wxDialog_new_0, 2189). --define(wxDialog_destruct, 2191). --define(wxDialog_Create, 2192). --define(wxDialog_CreateButtonSizer, 2193). --define(wxDialog_CreateStdDialogButtonSizer, 2194). --define(wxDialog_EndModal, 2195). --define(wxDialog_GetAffirmativeId, 2196). --define(wxDialog_GetReturnCode, 2197). --define(wxDialog_IsModal, 2198). --define(wxDialog_SetAffirmativeId, 2199). --define(wxDialog_SetReturnCode, 2200). --define(wxDialog_Show, 2201). --define(wxDialog_ShowModal, 2202). --define(wxColourDialog_new_0, 2203). --define(wxColourDialog_new_2, 2204). --define(wxColourDialog_destruct, 2205). --define(wxColourDialog_Create, 2206). --define(wxColourDialog_GetColourData, 2207). --define(wxColourData_new_0, 2208). --define(wxColourData_new_1, 2209). --define(wxColourData_destruct, 2210). --define(wxColourData_GetChooseFull, 2211). --define(wxColourData_GetColour, 2212). --define(wxColourData_GetCustomColour, 2214). --define(wxColourData_SetChooseFull, 2215). --define(wxColourData_SetColour, 2216). --define(wxColourData_SetCustomColour, 2217). --define(wxPalette_new_0, 2218). --define(wxPalette_new_4, 2219). --define(wxPalette_destruct, 2221). --define(wxPalette_Create, 2222). --define(wxPalette_GetColoursCount, 2223). --define(wxPalette_GetPixel, 2224). --define(wxPalette_GetRGB, 2225). --define(wxPalette_IsOk, 2226). --define(wxDirDialog_new, 2230). --define(wxDirDialog_destruct, 2231). --define(wxDirDialog_GetPath, 2232). --define(wxDirDialog_GetMessage, 2233). --define(wxDirDialog_SetMessage, 2234). --define(wxDirDialog_SetPath, 2235). --define(wxFileDialog_new, 2239). --define(wxFileDialog_destruct, 2240). --define(wxFileDialog_GetDirectory, 2241). --define(wxFileDialog_GetFilename, 2242). --define(wxFileDialog_GetFilenames, 2243). --define(wxFileDialog_GetFilterIndex, 2244). --define(wxFileDialog_GetMessage, 2245). --define(wxFileDialog_GetPath, 2246). --define(wxFileDialog_GetPaths, 2247). --define(wxFileDialog_GetWildcard, 2248). --define(wxFileDialog_SetDirectory, 2249). --define(wxFileDialog_SetFilename, 2250). --define(wxFileDialog_SetFilterIndex, 2251). --define(wxFileDialog_SetMessage, 2252). --define(wxFileDialog_SetPath, 2253). --define(wxFileDialog_SetWildcard, 2254). --define(wxPickerBase_SetInternalMargin, 2255). --define(wxPickerBase_GetInternalMargin, 2256). --define(wxPickerBase_SetTextCtrlProportion, 2257). --define(wxPickerBase_SetPickerCtrlProportion, 2258). --define(wxPickerBase_GetTextCtrlProportion, 2259). --define(wxPickerBase_GetPickerCtrlProportion, 2260). --define(wxPickerBase_HasTextCtrl, 2261). --define(wxPickerBase_GetTextCtrl, 2262). --define(wxPickerBase_IsTextCtrlGrowable, 2263). --define(wxPickerBase_SetPickerCtrlGrowable, 2264). --define(wxPickerBase_SetTextCtrlGrowable, 2265). --define(wxPickerBase_IsPickerCtrlGrowable, 2266). --define(wxFilePickerCtrl_new_0, 2267). --define(wxFilePickerCtrl_new_3, 2268). --define(wxFilePickerCtrl_Create, 2269). --define(wxFilePickerCtrl_GetPath, 2270). --define(wxFilePickerCtrl_SetPath, 2271). --define(wxFilePickerCtrl_destroy, 2272). --define(wxDirPickerCtrl_new_0, 2273). --define(wxDirPickerCtrl_new_3, 2274). --define(wxDirPickerCtrl_Create, 2275). --define(wxDirPickerCtrl_GetPath, 2276). --define(wxDirPickerCtrl_SetPath, 2277). --define(wxDirPickerCtrl_destroy, 2278). --define(wxColourPickerCtrl_new_0, 2279). --define(wxColourPickerCtrl_new_3, 2280). --define(wxColourPickerCtrl_Create, 2281). --define(wxColourPickerCtrl_GetColour, 2282). --define(wxColourPickerCtrl_SetColour_1_1, 2283). --define(wxColourPickerCtrl_SetColour_1_0, 2284). --define(wxColourPickerCtrl_destroy, 2285). --define(wxDatePickerCtrl_new_0, 2286). --define(wxDatePickerCtrl_new_3, 2287). --define(wxDatePickerCtrl_GetRange, 2288). --define(wxDatePickerCtrl_GetValue, 2289). --define(wxDatePickerCtrl_SetRange, 2290). --define(wxDatePickerCtrl_SetValue, 2291). --define(wxDatePickerCtrl_destroy, 2292). --define(wxFontPickerCtrl_new_0, 2293). --define(wxFontPickerCtrl_new_3, 2294). --define(wxFontPickerCtrl_Create, 2295). --define(wxFontPickerCtrl_GetSelectedFont, 2296). --define(wxFontPickerCtrl_SetSelectedFont, 2297). --define(wxFontPickerCtrl_GetMaxPointSize, 2298). --define(wxFontPickerCtrl_SetMaxPointSize, 2299). --define(wxFontPickerCtrl_destroy, 2300). --define(wxFindReplaceDialog_new_0, 2303). --define(wxFindReplaceDialog_new_4, 2304). --define(wxFindReplaceDialog_destruct, 2305). --define(wxFindReplaceDialog_Create, 2306). --define(wxFindReplaceDialog_GetData, 2307). --define(wxFindReplaceData_new_0, 2308). --define(wxFindReplaceData_new_1, 2309). --define(wxFindReplaceData_GetFindString, 2310). --define(wxFindReplaceData_GetReplaceString, 2311). --define(wxFindReplaceData_GetFlags, 2312). --define(wxFindReplaceData_SetFlags, 2313). --define(wxFindReplaceData_SetFindString, 2314). --define(wxFindReplaceData_SetReplaceString, 2315). --define(wxFindReplaceData_destroy, 2316). --define(wxMultiChoiceDialog_new_0, 2317). --define(wxMultiChoiceDialog_new_5, 2319). --define(wxMultiChoiceDialog_GetSelections, 2320). --define(wxMultiChoiceDialog_SetSelections, 2321). --define(wxMultiChoiceDialog_destroy, 2322). --define(wxSingleChoiceDialog_new_0, 2323). --define(wxSingleChoiceDialog_new_5, 2325). --define(wxSingleChoiceDialog_GetSelection, 2326). --define(wxSingleChoiceDialog_GetStringSelection, 2327). --define(wxSingleChoiceDialog_SetSelection, 2328). --define(wxSingleChoiceDialog_destroy, 2329). --define(wxTextEntryDialog_new, 2330). --define(wxTextEntryDialog_GetValue, 2331). --define(wxTextEntryDialog_SetValue, 2332). --define(wxTextEntryDialog_destroy, 2333). --define(wxPasswordEntryDialog_new, 2334). --define(wxPasswordEntryDialog_destroy, 2335). --define(wxFontData_new_0, 2336). --define(wxFontData_new_1, 2337). --define(wxFontData_destruct, 2338). --define(wxFontData_EnableEffects, 2339). --define(wxFontData_GetAllowSymbols, 2340). --define(wxFontData_GetColour, 2341). --define(wxFontData_GetChosenFont, 2342). --define(wxFontData_GetEnableEffects, 2343). --define(wxFontData_GetInitialFont, 2344). --define(wxFontData_GetShowHelp, 2345). --define(wxFontData_SetAllowSymbols, 2346). --define(wxFontData_SetChosenFont, 2347). --define(wxFontData_SetColour, 2348). --define(wxFontData_SetInitialFont, 2349). --define(wxFontData_SetRange, 2350). --define(wxFontData_SetShowHelp, 2351). --define(wxFontDialog_new_0, 2355). --define(wxFontDialog_new_2, 2357). --define(wxFontDialog_Create, 2359). --define(wxFontDialog_GetFontData, 2360). --define(wxFontDialog_destroy, 2362). --define(wxProgressDialog_new, 2363). --define(wxProgressDialog_destruct, 2364). --define(wxProgressDialog_Resume, 2365). --define(wxProgressDialog_Update_2, 2366). --define(wxProgressDialog_Update_0, 2367). --define(wxMessageDialog_new, 2368). --define(wxMessageDialog_destruct, 2369). --define(wxPageSetupDialog_new, 2370). --define(wxPageSetupDialog_destruct, 2371). --define(wxPageSetupDialog_GetPageSetupData, 2372). --define(wxPageSetupDialog_ShowModal, 2373). --define(wxPageSetupDialogData_new_0, 2374). --define(wxPageSetupDialogData_new_1_0, 2375). --define(wxPageSetupDialogData_new_1_1, 2376). --define(wxPageSetupDialogData_destruct, 2377). --define(wxPageSetupDialogData_EnableHelp, 2378). --define(wxPageSetupDialogData_EnableMargins, 2379). --define(wxPageSetupDialogData_EnableOrientation, 2380). --define(wxPageSetupDialogData_EnablePaper, 2381). --define(wxPageSetupDialogData_EnablePrinter, 2382). --define(wxPageSetupDialogData_GetDefaultMinMargins, 2383). --define(wxPageSetupDialogData_GetEnableMargins, 2384). --define(wxPageSetupDialogData_GetEnableOrientation, 2385). --define(wxPageSetupDialogData_GetEnablePaper, 2386). --define(wxPageSetupDialogData_GetEnablePrinter, 2387). --define(wxPageSetupDialogData_GetEnableHelp, 2388). --define(wxPageSetupDialogData_GetDefaultInfo, 2389). --define(wxPageSetupDialogData_GetMarginTopLeft, 2390). --define(wxPageSetupDialogData_GetMarginBottomRight, 2391). --define(wxPageSetupDialogData_GetMinMarginTopLeft, 2392). --define(wxPageSetupDialogData_GetMinMarginBottomRight, 2393). --define(wxPageSetupDialogData_GetPaperId, 2394). --define(wxPageSetupDialogData_GetPaperSize, 2395). --define(wxPageSetupDialogData_GetPrintData, 2397). --define(wxPageSetupDialogData_IsOk, 2398). --define(wxPageSetupDialogData_SetDefaultInfo, 2399). --define(wxPageSetupDialogData_SetDefaultMinMargins, 2400). --define(wxPageSetupDialogData_SetMarginTopLeft, 2401). --define(wxPageSetupDialogData_SetMarginBottomRight, 2402). --define(wxPageSetupDialogData_SetMinMarginTopLeft, 2403). --define(wxPageSetupDialogData_SetMinMarginBottomRight, 2404). --define(wxPageSetupDialogData_SetPaperId, 2405). --define(wxPageSetupDialogData_SetPaperSize_1_1, 2406). --define(wxPageSetupDialogData_SetPaperSize_1_0, 2407). --define(wxPageSetupDialogData_SetPrintData, 2408). --define(wxPrintDialog_new_2_0, 2409). --define(wxPrintDialog_new_2_1, 2410). --define(wxPrintDialog_destruct, 2411). --define(wxPrintDialog_GetPrintDialogData, 2412). --define(wxPrintDialog_GetPrintDC, 2413). --define(wxPrintDialogData_new_0, 2414). --define(wxPrintDialogData_new_1_1, 2415). --define(wxPrintDialogData_new_1_0, 2416). --define(wxPrintDialogData_destruct, 2417). --define(wxPrintDialogData_EnableHelp, 2418). --define(wxPrintDialogData_EnablePageNumbers, 2419). --define(wxPrintDialogData_EnablePrintToFile, 2420). --define(wxPrintDialogData_EnableSelection, 2421). --define(wxPrintDialogData_GetAllPages, 2422). --define(wxPrintDialogData_GetCollate, 2423). --define(wxPrintDialogData_GetFromPage, 2424). --define(wxPrintDialogData_GetMaxPage, 2425). --define(wxPrintDialogData_GetMinPage, 2426). --define(wxPrintDialogData_GetNoCopies, 2427). --define(wxPrintDialogData_GetPrintData, 2428). --define(wxPrintDialogData_GetPrintToFile, 2429). --define(wxPrintDialogData_GetSelection, 2430). --define(wxPrintDialogData_GetToPage, 2431). --define(wxPrintDialogData_IsOk, 2432). --define(wxPrintDialogData_SetCollate, 2433). --define(wxPrintDialogData_SetFromPage, 2434). --define(wxPrintDialogData_SetMaxPage, 2435). --define(wxPrintDialogData_SetMinPage, 2436). --define(wxPrintDialogData_SetNoCopies, 2437). --define(wxPrintDialogData_SetPrintData, 2438). --define(wxPrintDialogData_SetPrintToFile, 2439). --define(wxPrintDialogData_SetSelection, 2440). --define(wxPrintDialogData_SetToPage, 2441). --define(wxPrintData_new_0, 2442). --define(wxPrintData_new_1, 2443). --define(wxPrintData_destruct, 2444). --define(wxPrintData_GetCollate, 2445). --define(wxPrintData_GetBin, 2446). --define(wxPrintData_GetColour, 2447). --define(wxPrintData_GetDuplex, 2448). --define(wxPrintData_GetNoCopies, 2449). --define(wxPrintData_GetOrientation, 2450). --define(wxPrintData_GetPaperId, 2451). --define(wxPrintData_GetPrinterName, 2452). --define(wxPrintData_GetQuality, 2453). --define(wxPrintData_IsOk, 2454). --define(wxPrintData_SetBin, 2455). --define(wxPrintData_SetCollate, 2456). --define(wxPrintData_SetColour, 2457). --define(wxPrintData_SetDuplex, 2458). --define(wxPrintData_SetNoCopies, 2459). --define(wxPrintData_SetOrientation, 2460). --define(wxPrintData_SetPaperId, 2461). --define(wxPrintData_SetPrinterName, 2462). --define(wxPrintData_SetQuality, 2463). --define(wxPrintPreview_new_2, 2466). --define(wxPrintPreview_new_3, 2467). --define(wxPrintPreview_destruct, 2469). --define(wxPrintPreview_GetCanvas, 2470). --define(wxPrintPreview_GetCurrentPage, 2471). --define(wxPrintPreview_GetFrame, 2472). --define(wxPrintPreview_GetMaxPage, 2473). --define(wxPrintPreview_GetMinPage, 2474). --define(wxPrintPreview_GetPrintout, 2475). --define(wxPrintPreview_GetPrintoutForPrinting, 2476). --define(wxPrintPreview_IsOk, 2477). --define(wxPrintPreview_PaintPage, 2478). --define(wxPrintPreview_Print, 2479). --define(wxPrintPreview_RenderPage, 2480). --define(wxPrintPreview_SetCanvas, 2481). --define(wxPrintPreview_SetCurrentPage, 2482). --define(wxPrintPreview_SetFrame, 2483). --define(wxPrintPreview_SetPrintout, 2484). --define(wxPrintPreview_SetZoom, 2485). --define(wxPreviewFrame_new, 2486). --define(wxPreviewFrame_destruct, 2487). --define(wxPreviewFrame_CreateControlBar, 2488). --define(wxPreviewFrame_CreateCanvas, 2489). --define(wxPreviewFrame_Initialize, 2490). --define(wxPreviewFrame_OnCloseWindow, 2491). --define(wxPreviewControlBar_new, 2492). --define(wxPreviewControlBar_destruct, 2493). --define(wxPreviewControlBar_CreateButtons, 2494). --define(wxPreviewControlBar_GetPrintPreview, 2495). --define(wxPreviewControlBar_GetZoomControl, 2496). --define(wxPreviewControlBar_SetZoomControl, 2497). --define(wxPrinter_new, 2499). --define(wxPrinter_CreateAbortWindow, 2500). --define(wxPrinter_GetAbort, 2501). --define(wxPrinter_GetLastError, 2502). --define(wxPrinter_GetPrintDialogData, 2503). --define(wxPrinter_Print, 2504). --define(wxPrinter_PrintDialog, 2505). --define(wxPrinter_ReportError, 2506). --define(wxPrinter_Setup, 2507). --define(wxPrinter_destroy, 2508). --define(wxXmlResource_new_1, 2509). --define(wxXmlResource_new_2, 2510). --define(wxXmlResource_destruct, 2511). --define(wxXmlResource_AttachUnknownControl, 2512). --define(wxXmlResource_ClearHandlers, 2513). --define(wxXmlResource_CompareVersion, 2514). --define(wxXmlResource_Get, 2515). --define(wxXmlResource_GetFlags, 2516). --define(wxXmlResource_GetVersion, 2517). --define(wxXmlResource_GetXRCID, 2518). --define(wxXmlResource_InitAllHandlers, 2519). --define(wxXmlResource_Load, 2520). --define(wxXmlResource_LoadBitmap, 2521). --define(wxXmlResource_LoadDialog_2, 2522). --define(wxXmlResource_LoadDialog_3, 2523). --define(wxXmlResource_LoadFrame_2, 2524). --define(wxXmlResource_LoadFrame_3, 2525). --define(wxXmlResource_LoadIcon, 2526). --define(wxXmlResource_LoadMenu, 2527). --define(wxXmlResource_LoadMenuBar_2, 2528). --define(wxXmlResource_LoadMenuBar_1, 2529). --define(wxXmlResource_LoadPanel_2, 2530). --define(wxXmlResource_LoadPanel_3, 2531). --define(wxXmlResource_LoadToolBar, 2532). --define(wxXmlResource_Set, 2533). --define(wxXmlResource_SetFlags, 2534). --define(wxXmlResource_Unload, 2535). --define(wxXmlResource_xrcctrl, 2536). --define(wxHtmlEasyPrinting_new, 2537). --define(wxHtmlEasyPrinting_destruct, 2538). --define(wxHtmlEasyPrinting_GetPrintData, 2539). --define(wxHtmlEasyPrinting_GetPageSetupData, 2540). --define(wxHtmlEasyPrinting_PreviewFile, 2541). --define(wxHtmlEasyPrinting_PreviewText, 2542). --define(wxHtmlEasyPrinting_PrintFile, 2543). --define(wxHtmlEasyPrinting_PrintText, 2544). --define(wxHtmlEasyPrinting_PageSetup, 2545). --define(wxHtmlEasyPrinting_SetFonts, 2546). --define(wxHtmlEasyPrinting_SetHeader, 2547). --define(wxHtmlEasyPrinting_SetFooter, 2548). --define(wxGLCanvas_new_2, 2550). --define(wxGLCanvas_new_3_1, 2551). --define(wxGLCanvas_new_3_0, 2552). --define(wxGLCanvas_GetContext, 2553). --define(wxGLCanvas_SetCurrent, 2555). --define(wxGLCanvas_SwapBuffers, 2556). --define(wxGLCanvas_destroy, 2557). --define(wxAuiManager_new, 2558). --define(wxAuiManager_destruct, 2559). --define(wxAuiManager_AddPane_2_1, 2560). --define(wxAuiManager_AddPane_3, 2561). --define(wxAuiManager_AddPane_2_0, 2562). --define(wxAuiManager_DetachPane, 2563). --define(wxAuiManager_GetAllPanes, 2564). --define(wxAuiManager_GetArtProvider, 2565). --define(wxAuiManager_GetDockSizeConstraint, 2566). --define(wxAuiManager_GetFlags, 2567). --define(wxAuiManager_GetManagedWindow, 2568). --define(wxAuiManager_GetManager, 2569). --define(wxAuiManager_GetPane_1_1, 2570). --define(wxAuiManager_GetPane_1_0, 2571). --define(wxAuiManager_HideHint, 2572). --define(wxAuiManager_InsertPane, 2573). --define(wxAuiManager_LoadPaneInfo, 2574). --define(wxAuiManager_LoadPerspective, 2575). --define(wxAuiManager_SavePaneInfo, 2576). --define(wxAuiManager_SavePerspective, 2577). --define(wxAuiManager_SetArtProvider, 2578). --define(wxAuiManager_SetDockSizeConstraint, 2579). --define(wxAuiManager_SetFlags, 2580). --define(wxAuiManager_SetManagedWindow, 2581). --define(wxAuiManager_ShowHint, 2582). --define(wxAuiManager_UnInit, 2583). --define(wxAuiManager_Update, 2584). --define(wxAuiPaneInfo_new_0, 2585). --define(wxAuiPaneInfo_new_1, 2586). --define(wxAuiPaneInfo_destruct, 2587). --define(wxAuiPaneInfo_BestSize_1, 2588). --define(wxAuiPaneInfo_BestSize_2, 2589). --define(wxAuiPaneInfo_Bottom, 2590). --define(wxAuiPaneInfo_BottomDockable, 2591). --define(wxAuiPaneInfo_Caption, 2592). --define(wxAuiPaneInfo_CaptionVisible, 2593). --define(wxAuiPaneInfo_Centre, 2594). --define(wxAuiPaneInfo_CentrePane, 2595). --define(wxAuiPaneInfo_CloseButton, 2596). --define(wxAuiPaneInfo_DefaultPane, 2597). --define(wxAuiPaneInfo_DestroyOnClose, 2598). --define(wxAuiPaneInfo_Direction, 2599). --define(wxAuiPaneInfo_Dock, 2600). --define(wxAuiPaneInfo_Dockable, 2601). --define(wxAuiPaneInfo_Fixed, 2602). --define(wxAuiPaneInfo_Float, 2603). --define(wxAuiPaneInfo_Floatable, 2604). --define(wxAuiPaneInfo_FloatingPosition_1, 2605). --define(wxAuiPaneInfo_FloatingPosition_2, 2606). --define(wxAuiPaneInfo_FloatingSize_1, 2607). --define(wxAuiPaneInfo_FloatingSize_2, 2608). --define(wxAuiPaneInfo_Gripper, 2609). --define(wxAuiPaneInfo_GripperTop, 2610). --define(wxAuiPaneInfo_HasBorder, 2611). --define(wxAuiPaneInfo_HasCaption, 2612). --define(wxAuiPaneInfo_HasCloseButton, 2613). --define(wxAuiPaneInfo_HasFlag, 2614). --define(wxAuiPaneInfo_HasGripper, 2615). --define(wxAuiPaneInfo_HasGripperTop, 2616). --define(wxAuiPaneInfo_HasMaximizeButton, 2617). --define(wxAuiPaneInfo_HasMinimizeButton, 2618). --define(wxAuiPaneInfo_HasPinButton, 2619). --define(wxAuiPaneInfo_Hide, 2620). --define(wxAuiPaneInfo_IsBottomDockable, 2621). --define(wxAuiPaneInfo_IsDocked, 2622). --define(wxAuiPaneInfo_IsFixed, 2623). --define(wxAuiPaneInfo_IsFloatable, 2624). --define(wxAuiPaneInfo_IsFloating, 2625). --define(wxAuiPaneInfo_IsLeftDockable, 2626). --define(wxAuiPaneInfo_IsMovable, 2627). --define(wxAuiPaneInfo_IsOk, 2628). --define(wxAuiPaneInfo_IsResizable, 2629). --define(wxAuiPaneInfo_IsRightDockable, 2630). --define(wxAuiPaneInfo_IsShown, 2631). --define(wxAuiPaneInfo_IsToolbar, 2632). --define(wxAuiPaneInfo_IsTopDockable, 2633). --define(wxAuiPaneInfo_Layer, 2634). --define(wxAuiPaneInfo_Left, 2635). --define(wxAuiPaneInfo_LeftDockable, 2636). --define(wxAuiPaneInfo_MaxSize_1, 2637). --define(wxAuiPaneInfo_MaxSize_2, 2638). --define(wxAuiPaneInfo_MaximizeButton, 2639). --define(wxAuiPaneInfo_MinSize_1, 2640). --define(wxAuiPaneInfo_MinSize_2, 2641). --define(wxAuiPaneInfo_MinimizeButton, 2642). --define(wxAuiPaneInfo_Movable, 2643). --define(wxAuiPaneInfo_Name, 2644). --define(wxAuiPaneInfo_PaneBorder, 2645). --define(wxAuiPaneInfo_PinButton, 2646). --define(wxAuiPaneInfo_Position, 2647). --define(wxAuiPaneInfo_Resizable, 2648). --define(wxAuiPaneInfo_Right, 2649). --define(wxAuiPaneInfo_RightDockable, 2650). --define(wxAuiPaneInfo_Row, 2651). --define(wxAuiPaneInfo_SafeSet, 2652). --define(wxAuiPaneInfo_SetFlag, 2653). --define(wxAuiPaneInfo_Show, 2654). --define(wxAuiPaneInfo_ToolbarPane, 2655). --define(wxAuiPaneInfo_Top, 2656). --define(wxAuiPaneInfo_TopDockable, 2657). --define(wxAuiPaneInfo_Window, 2658). --define(wxAuiPaneInfo_GetWindow, 2659). --define(wxAuiPaneInfo_GetFrame, 2660). --define(wxAuiPaneInfo_GetDirection, 2661). --define(wxAuiPaneInfo_GetLayer, 2662). --define(wxAuiPaneInfo_GetRow, 2663). --define(wxAuiPaneInfo_GetPosition, 2664). --define(wxAuiPaneInfo_GetFloatingPosition, 2665). --define(wxAuiPaneInfo_GetFloatingSize, 2666). --define(wxAuiNotebook_new_0, 2667). --define(wxAuiNotebook_new_2, 2668). --define(wxAuiNotebook_AddPage, 2669). --define(wxAuiNotebook_Create, 2670). --define(wxAuiNotebook_DeletePage, 2671). --define(wxAuiNotebook_GetArtProvider, 2672). --define(wxAuiNotebook_GetPage, 2673). --define(wxAuiNotebook_GetPageBitmap, 2674). --define(wxAuiNotebook_GetPageCount, 2675). --define(wxAuiNotebook_GetPageIndex, 2676). --define(wxAuiNotebook_GetPageText, 2677). --define(wxAuiNotebook_GetSelection, 2678). --define(wxAuiNotebook_InsertPage, 2679). --define(wxAuiNotebook_RemovePage, 2680). --define(wxAuiNotebook_SetArtProvider, 2681). --define(wxAuiNotebook_SetFont, 2682). --define(wxAuiNotebook_SetPageBitmap, 2683). --define(wxAuiNotebook_SetPageText, 2684). --define(wxAuiNotebook_SetSelection, 2685). --define(wxAuiNotebook_SetTabCtrlHeight, 2686). --define(wxAuiNotebook_SetUniformBitmapSize, 2687). --define(wxAuiNotebook_destroy, 2688). --define(wxAuiTabArt_SetFlags, 2689). --define(wxAuiTabArt_SetMeasuringFont, 2690). --define(wxAuiTabArt_SetNormalFont, 2691). --define(wxAuiTabArt_SetSelectedFont, 2692). --define(wxAuiTabArt_SetColour, 2693). --define(wxAuiTabArt_SetActiveColour, 2694). --define(wxAuiDockArt_GetColour, 2695). --define(wxAuiDockArt_GetFont, 2696). --define(wxAuiDockArt_GetMetric, 2697). --define(wxAuiDockArt_SetColour, 2698). --define(wxAuiDockArt_SetFont, 2699). --define(wxAuiDockArt_SetMetric, 2700). --define(wxAuiSimpleTabArt_new, 2701). --define(wxAuiSimpleTabArt_destroy, 2702). --define(wxMDIParentFrame_new_0, 2703). --define(wxMDIParentFrame_new_4, 2704). --define(wxMDIParentFrame_destruct, 2705). --define(wxMDIParentFrame_ActivateNext, 2706). --define(wxMDIParentFrame_ActivatePrevious, 2707). --define(wxMDIParentFrame_ArrangeIcons, 2708). --define(wxMDIParentFrame_Cascade, 2709). --define(wxMDIParentFrame_Create, 2710). --define(wxMDIParentFrame_GetActiveChild, 2711). --define(wxMDIParentFrame_GetClientWindow, 2712). --define(wxMDIParentFrame_Tile, 2713). --define(wxMDIChildFrame_new_0, 2714). --define(wxMDIChildFrame_new_4, 2715). --define(wxMDIChildFrame_destruct, 2716). --define(wxMDIChildFrame_Activate, 2717). --define(wxMDIChildFrame_Create, 2718). --define(wxMDIChildFrame_Maximize, 2719). --define(wxMDIChildFrame_Restore, 2720). --define(wxMDIClientWindow_new_0, 2721). --define(wxMDIClientWindow_new_2, 2722). --define(wxMDIClientWindow_destruct, 2723). --define(wxMDIClientWindow_CreateClient, 2724). --define(wxLayoutAlgorithm_new, 2725). --define(wxLayoutAlgorithm_LayoutFrame, 2726). --define(wxLayoutAlgorithm_LayoutMDIFrame, 2727). --define(wxLayoutAlgorithm_LayoutWindow, 2728). --define(wxLayoutAlgorithm_destroy, 2729). --define(wxEvent_GetId, 2730). --define(wxEvent_GetSkipped, 2731). --define(wxEvent_GetTimestamp, 2732). --define(wxEvent_IsCommandEvent, 2733). --define(wxEvent_ResumePropagation, 2734). --define(wxEvent_ShouldPropagate, 2735). --define(wxEvent_Skip, 2736). --define(wxEvent_StopPropagation, 2737). --define(wxCommandEvent_getClientData, 2738). --define(wxCommandEvent_GetExtraLong, 2739). --define(wxCommandEvent_GetInt, 2740). --define(wxCommandEvent_GetSelection, 2741). --define(wxCommandEvent_GetString, 2742). --define(wxCommandEvent_IsChecked, 2743). --define(wxCommandEvent_IsSelection, 2744). --define(wxCommandEvent_SetInt, 2745). --define(wxCommandEvent_SetString, 2746). --define(wxScrollEvent_GetOrientation, 2747). --define(wxScrollEvent_GetPosition, 2748). --define(wxScrollWinEvent_GetOrientation, 2749). --define(wxScrollWinEvent_GetPosition, 2750). --define(wxMouseEvent_AltDown, 2751). --define(wxMouseEvent_Button, 2752). --define(wxMouseEvent_ButtonDClick, 2753). --define(wxMouseEvent_ButtonDown, 2754). --define(wxMouseEvent_ButtonUp, 2755). --define(wxMouseEvent_CmdDown, 2756). --define(wxMouseEvent_ControlDown, 2757). --define(wxMouseEvent_Dragging, 2758). --define(wxMouseEvent_Entering, 2759). --define(wxMouseEvent_GetButton, 2760). --define(wxMouseEvent_GetPosition, 2763). --define(wxMouseEvent_GetLogicalPosition, 2764). --define(wxMouseEvent_GetLinesPerAction, 2765). --define(wxMouseEvent_GetWheelRotation, 2766). --define(wxMouseEvent_GetWheelDelta, 2767). --define(wxMouseEvent_GetX, 2768). --define(wxMouseEvent_GetY, 2769). --define(wxMouseEvent_IsButton, 2770). --define(wxMouseEvent_IsPageScroll, 2771). --define(wxMouseEvent_Leaving, 2772). --define(wxMouseEvent_LeftDClick, 2773). --define(wxMouseEvent_LeftDown, 2774). --define(wxMouseEvent_LeftIsDown, 2775). --define(wxMouseEvent_LeftUp, 2776). --define(wxMouseEvent_MetaDown, 2777). --define(wxMouseEvent_MiddleDClick, 2778). --define(wxMouseEvent_MiddleDown, 2779). --define(wxMouseEvent_MiddleIsDown, 2780). --define(wxMouseEvent_MiddleUp, 2781). --define(wxMouseEvent_Moving, 2782). --define(wxMouseEvent_RightDClick, 2783). --define(wxMouseEvent_RightDown, 2784). --define(wxMouseEvent_RightIsDown, 2785). --define(wxMouseEvent_RightUp, 2786). --define(wxMouseEvent_ShiftDown, 2787). --define(wxSetCursorEvent_GetCursor, 2788). --define(wxSetCursorEvent_GetX, 2789). --define(wxSetCursorEvent_GetY, 2790). --define(wxSetCursorEvent_HasCursor, 2791). --define(wxSetCursorEvent_SetCursor, 2792). --define(wxKeyEvent_AltDown, 2793). --define(wxKeyEvent_CmdDown, 2794). --define(wxKeyEvent_ControlDown, 2795). --define(wxKeyEvent_GetKeyCode, 2796). --define(wxKeyEvent_GetModifiers, 2797). --define(wxKeyEvent_GetPosition, 2800). --define(wxKeyEvent_GetRawKeyCode, 2801). --define(wxKeyEvent_GetRawKeyFlags, 2802). --define(wxKeyEvent_GetUnicodeKey, 2803). --define(wxKeyEvent_GetX, 2804). --define(wxKeyEvent_GetY, 2805). --define(wxKeyEvent_HasModifiers, 2806). --define(wxKeyEvent_MetaDown, 2807). --define(wxKeyEvent_ShiftDown, 2808). --define(wxSizeEvent_GetSize, 2809). --define(wxMoveEvent_GetPosition, 2810). --define(wxEraseEvent_GetDC, 2811). --define(wxFocusEvent_GetWindow, 2812). --define(wxChildFocusEvent_GetWindow, 2813). --define(wxMenuEvent_GetMenu, 2814). --define(wxMenuEvent_GetMenuId, 2815). --define(wxMenuEvent_IsPopup, 2816). --define(wxCloseEvent_CanVeto, 2817). --define(wxCloseEvent_GetLoggingOff, 2818). --define(wxCloseEvent_SetCanVeto, 2819). --define(wxCloseEvent_SetLoggingOff, 2820). --define(wxCloseEvent_Veto, 2821). --define(wxShowEvent_SetShow, 2822). --define(wxShowEvent_GetShow, 2823). --define(wxIconizeEvent_Iconized, 2824). --define(wxJoystickEvent_ButtonDown, 2825). --define(wxJoystickEvent_ButtonIsDown, 2826). --define(wxJoystickEvent_ButtonUp, 2827). --define(wxJoystickEvent_GetButtonChange, 2828). --define(wxJoystickEvent_GetButtonState, 2829). --define(wxJoystickEvent_GetJoystick, 2830). --define(wxJoystickEvent_GetPosition, 2831). --define(wxJoystickEvent_GetZPosition, 2832). --define(wxJoystickEvent_IsButton, 2833). --define(wxJoystickEvent_IsMove, 2834). --define(wxJoystickEvent_IsZMove, 2835). --define(wxUpdateUIEvent_CanUpdate, 2836). --define(wxUpdateUIEvent_Check, 2837). --define(wxUpdateUIEvent_Enable, 2838). --define(wxUpdateUIEvent_Show, 2839). --define(wxUpdateUIEvent_GetChecked, 2840). --define(wxUpdateUIEvent_GetEnabled, 2841). --define(wxUpdateUIEvent_GetShown, 2842). --define(wxUpdateUIEvent_GetSetChecked, 2843). --define(wxUpdateUIEvent_GetSetEnabled, 2844). --define(wxUpdateUIEvent_GetSetShown, 2845). --define(wxUpdateUIEvent_GetSetText, 2846). --define(wxUpdateUIEvent_GetText, 2847). --define(wxUpdateUIEvent_GetMode, 2848). --define(wxUpdateUIEvent_GetUpdateInterval, 2849). --define(wxUpdateUIEvent_ResetUpdateTime, 2850). --define(wxUpdateUIEvent_SetMode, 2851). --define(wxUpdateUIEvent_SetText, 2852). --define(wxUpdateUIEvent_SetUpdateInterval, 2853). --define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2854). --define(wxPaletteChangedEvent_SetChangedWindow, 2855). --define(wxPaletteChangedEvent_GetChangedWindow, 2856). --define(wxQueryNewPaletteEvent_SetPaletteRealized, 2857). --define(wxQueryNewPaletteEvent_GetPaletteRealized, 2858). --define(wxNavigationKeyEvent_GetDirection, 2859). --define(wxNavigationKeyEvent_SetDirection, 2860). --define(wxNavigationKeyEvent_IsWindowChange, 2861). --define(wxNavigationKeyEvent_SetWindowChange, 2862). --define(wxNavigationKeyEvent_IsFromTab, 2863). --define(wxNavigationKeyEvent_SetFromTab, 2864). --define(wxNavigationKeyEvent_GetCurrentFocus, 2865). --define(wxNavigationKeyEvent_SetCurrentFocus, 2866). --define(wxHelpEvent_GetOrigin, 2867). --define(wxHelpEvent_GetPosition, 2868). --define(wxHelpEvent_SetOrigin, 2869). --define(wxHelpEvent_SetPosition, 2870). --define(wxContextMenuEvent_GetPosition, 2871). --define(wxContextMenuEvent_SetPosition, 2872). --define(wxIdleEvent_CanSend, 2873). --define(wxIdleEvent_GetMode, 2874). --define(wxIdleEvent_RequestMore, 2875). --define(wxIdleEvent_MoreRequested, 2876). --define(wxIdleEvent_SetMode, 2877). --define(wxGridEvent_AltDown, 2878). --define(wxGridEvent_ControlDown, 2879). --define(wxGridEvent_GetCol, 2880). --define(wxGridEvent_GetPosition, 2881). --define(wxGridEvent_GetRow, 2882). --define(wxGridEvent_MetaDown, 2883). --define(wxGridEvent_Selecting, 2884). --define(wxGridEvent_ShiftDown, 2885). --define(wxNotifyEvent_Allow, 2886). --define(wxNotifyEvent_IsAllowed, 2887). --define(wxNotifyEvent_Veto, 2888). --define(wxSashEvent_GetEdge, 2889). --define(wxSashEvent_GetDragRect, 2890). --define(wxSashEvent_GetDragStatus, 2891). --define(wxListEvent_GetCacheFrom, 2892). --define(wxListEvent_GetCacheTo, 2893). --define(wxListEvent_GetKeyCode, 2894). --define(wxListEvent_GetIndex, 2895). --define(wxListEvent_GetColumn, 2896). --define(wxListEvent_GetPoint, 2897). --define(wxListEvent_GetLabel, 2898). --define(wxListEvent_GetText, 2899). --define(wxListEvent_GetImage, 2900). --define(wxListEvent_GetData, 2901). --define(wxListEvent_GetMask, 2902). --define(wxListEvent_GetItem, 2903). --define(wxListEvent_IsEditCancelled, 2904). --define(wxDateEvent_GetDate, 2905). --define(wxCalendarEvent_GetWeekDay, 2906). --define(wxFileDirPickerEvent_GetPath, 2907). --define(wxColourPickerEvent_GetColour, 2908). --define(wxFontPickerEvent_GetFont, 2909). --define(wxStyledTextEvent_GetPosition, 2910). --define(wxStyledTextEvent_GetKey, 2911). --define(wxStyledTextEvent_GetModifiers, 2912). --define(wxStyledTextEvent_GetModificationType, 2913). --define(wxStyledTextEvent_GetText, 2914). --define(wxStyledTextEvent_GetLength, 2915). --define(wxStyledTextEvent_GetLinesAdded, 2916). --define(wxStyledTextEvent_GetLine, 2917). --define(wxStyledTextEvent_GetFoldLevelNow, 2918). --define(wxStyledTextEvent_GetFoldLevelPrev, 2919). --define(wxStyledTextEvent_GetMargin, 2920). --define(wxStyledTextEvent_GetMessage, 2921). --define(wxStyledTextEvent_GetWParam, 2922). --define(wxStyledTextEvent_GetLParam, 2923). --define(wxStyledTextEvent_GetListType, 2924). --define(wxStyledTextEvent_GetX, 2925). --define(wxStyledTextEvent_GetY, 2926). --define(wxStyledTextEvent_GetDragText, 2927). --define(wxStyledTextEvent_GetDragAllowMove, 2928). --define(wxStyledTextEvent_GetDragResult, 2929). --define(wxStyledTextEvent_GetShift, 2930). --define(wxStyledTextEvent_GetControl, 2931). --define(wxStyledTextEvent_GetAlt, 2932). --define(utils_wxGetKeyState, 2933). --define(utils_wxGetMousePosition, 2934). --define(utils_wxGetMouseState, 2935). --define(utils_wxSetDetectableAutoRepeat, 2936). --define(utils_wxBell, 2937). --define(utils_wxFindMenuItemId, 2938). --define(utils_wxGenericFindWindowAtPoint, 2939). --define(utils_wxFindWindowAtPoint, 2940). --define(utils_wxBeginBusyCursor, 2941). --define(utils_wxEndBusyCursor, 2942). --define(utils_wxIsBusy, 2943). --define(utils_wxShutdown, 2944). --define(utils_wxShell, 2945). --define(utils_wxLaunchDefaultBrowser, 2946). --define(utils_wxGetEmailAddress, 2947). --define(utils_wxGetUserId, 2948). --define(utils_wxGetHomeDir, 2949). --define(utils_wxNewId, 2950). --define(utils_wxRegisterId, 2951). --define(utils_wxGetCurrentId, 2952). --define(utils_wxGetOsDescription, 2953). --define(utils_wxIsPlatformLittleEndian, 2954). --define(utils_wxIsPlatform64Bit, 2955). --define(gdicmn_wxDisplaySize, 2956). --define(gdicmn_wxSetCursor, 2957). --define(wxPrintout_new, 2958). --define(wxPrintout_destruct, 2959). --define(wxPrintout_GetDC, 2960). --define(wxPrintout_GetPageSizeMM, 2961). --define(wxPrintout_GetPageSizePixels, 2962). --define(wxPrintout_GetPaperRectPixels, 2963). --define(wxPrintout_GetPPIPrinter, 2964). --define(wxPrintout_GetPPIScreen, 2965). --define(wxPrintout_GetTitle, 2966). --define(wxPrintout_IsPreview, 2967). --define(wxPrintout_FitThisSizeToPaper, 2968). --define(wxPrintout_FitThisSizeToPage, 2969). --define(wxPrintout_FitThisSizeToPageMargins, 2970). --define(wxPrintout_MapScreenSizeToPaper, 2971). --define(wxPrintout_MapScreenSizeToPage, 2972). --define(wxPrintout_MapScreenSizeToPageMargins, 2973). --define(wxPrintout_MapScreenSizeToDevice, 2974). --define(wxPrintout_GetLogicalPaperRect, 2975). --define(wxPrintout_GetLogicalPageRect, 2976). --define(wxPrintout_GetLogicalPageMarginsRect, 2977). --define(wxPrintout_SetLogicalOrigin, 2978). --define(wxPrintout_OffsetLogicalOrigin, 2979). --define(wxStyledTextCtrl_new_2, 2980). --define(wxStyledTextCtrl_new_0, 2981). --define(wxStyledTextCtrl_destruct, 2982). --define(wxStyledTextCtrl_Create, 2983). --define(wxStyledTextCtrl_AddText, 2984). --define(wxStyledTextCtrl_AddStyledText, 2985). --define(wxStyledTextCtrl_InsertText, 2986). --define(wxStyledTextCtrl_ClearAll, 2987). --define(wxStyledTextCtrl_ClearDocumentStyle, 2988). --define(wxStyledTextCtrl_GetLength, 2989). --define(wxStyledTextCtrl_GetCharAt, 2990). --define(wxStyledTextCtrl_GetCurrentPos, 2991). --define(wxStyledTextCtrl_GetAnchor, 2992). --define(wxStyledTextCtrl_GetStyleAt, 2993). --define(wxStyledTextCtrl_Redo, 2994). --define(wxStyledTextCtrl_SetUndoCollection, 2995). --define(wxStyledTextCtrl_SelectAll, 2996). --define(wxStyledTextCtrl_SetSavePoint, 2997). --define(wxStyledTextCtrl_GetStyledText, 2998). --define(wxStyledTextCtrl_CanRedo, 2999). --define(wxStyledTextCtrl_MarkerLineFromHandle, 3000). --define(wxStyledTextCtrl_MarkerDeleteHandle, 3001). --define(wxStyledTextCtrl_GetUndoCollection, 3002). --define(wxStyledTextCtrl_GetViewWhiteSpace, 3003). --define(wxStyledTextCtrl_SetViewWhiteSpace, 3004). --define(wxStyledTextCtrl_PositionFromPoint, 3005). --define(wxStyledTextCtrl_PositionFromPointClose, 3006). --define(wxStyledTextCtrl_GotoLine, 3007). --define(wxStyledTextCtrl_GotoPos, 3008). --define(wxStyledTextCtrl_SetAnchor, 3009). --define(wxStyledTextCtrl_GetCurLine, 3010). --define(wxStyledTextCtrl_GetEndStyled, 3011). --define(wxStyledTextCtrl_ConvertEOLs, 3012). --define(wxStyledTextCtrl_GetEOLMode, 3013). --define(wxStyledTextCtrl_SetEOLMode, 3014). --define(wxStyledTextCtrl_StartStyling, 3015). --define(wxStyledTextCtrl_SetStyling, 3016). --define(wxStyledTextCtrl_GetBufferedDraw, 3017). --define(wxStyledTextCtrl_SetBufferedDraw, 3018). --define(wxStyledTextCtrl_SetTabWidth, 3019). --define(wxStyledTextCtrl_GetTabWidth, 3020). --define(wxStyledTextCtrl_SetCodePage, 3021). --define(wxStyledTextCtrl_MarkerDefine, 3022). --define(wxStyledTextCtrl_MarkerSetForeground, 3023). --define(wxStyledTextCtrl_MarkerSetBackground, 3024). --define(wxStyledTextCtrl_MarkerAdd, 3025). --define(wxStyledTextCtrl_MarkerDelete, 3026). --define(wxStyledTextCtrl_MarkerDeleteAll, 3027). --define(wxStyledTextCtrl_MarkerGet, 3028). --define(wxStyledTextCtrl_MarkerNext, 3029). --define(wxStyledTextCtrl_MarkerPrevious, 3030). --define(wxStyledTextCtrl_MarkerDefineBitmap, 3031). --define(wxStyledTextCtrl_MarkerAddSet, 3032). --define(wxStyledTextCtrl_MarkerSetAlpha, 3033). --define(wxStyledTextCtrl_SetMarginType, 3034). --define(wxStyledTextCtrl_GetMarginType, 3035). --define(wxStyledTextCtrl_SetMarginWidth, 3036). --define(wxStyledTextCtrl_GetMarginWidth, 3037). --define(wxStyledTextCtrl_SetMarginMask, 3038). --define(wxStyledTextCtrl_GetMarginMask, 3039). --define(wxStyledTextCtrl_SetMarginSensitive, 3040). --define(wxStyledTextCtrl_GetMarginSensitive, 3041). --define(wxStyledTextCtrl_StyleClearAll, 3042). --define(wxStyledTextCtrl_StyleSetForeground, 3043). --define(wxStyledTextCtrl_StyleSetBackground, 3044). --define(wxStyledTextCtrl_StyleSetBold, 3045). --define(wxStyledTextCtrl_StyleSetItalic, 3046). --define(wxStyledTextCtrl_StyleSetSize, 3047). --define(wxStyledTextCtrl_StyleSetFaceName, 3048). --define(wxStyledTextCtrl_StyleSetEOLFilled, 3049). --define(wxStyledTextCtrl_StyleResetDefault, 3050). --define(wxStyledTextCtrl_StyleSetUnderline, 3051). --define(wxStyledTextCtrl_StyleSetCase, 3052). --define(wxStyledTextCtrl_StyleSetHotSpot, 3053). --define(wxStyledTextCtrl_SetSelForeground, 3054). --define(wxStyledTextCtrl_SetSelBackground, 3055). --define(wxStyledTextCtrl_GetSelAlpha, 3056). --define(wxStyledTextCtrl_SetSelAlpha, 3057). --define(wxStyledTextCtrl_SetCaretForeground, 3058). --define(wxStyledTextCtrl_CmdKeyAssign, 3059). --define(wxStyledTextCtrl_CmdKeyClear, 3060). --define(wxStyledTextCtrl_CmdKeyClearAll, 3061). --define(wxStyledTextCtrl_SetStyleBytes, 3062). --define(wxStyledTextCtrl_StyleSetVisible, 3063). --define(wxStyledTextCtrl_GetCaretPeriod, 3064). --define(wxStyledTextCtrl_SetCaretPeriod, 3065). --define(wxStyledTextCtrl_SetWordChars, 3066). --define(wxStyledTextCtrl_BeginUndoAction, 3067). --define(wxStyledTextCtrl_EndUndoAction, 3068). --define(wxStyledTextCtrl_IndicatorSetStyle, 3069). --define(wxStyledTextCtrl_IndicatorGetStyle, 3070). --define(wxStyledTextCtrl_IndicatorSetForeground, 3071). --define(wxStyledTextCtrl_IndicatorGetForeground, 3072). --define(wxStyledTextCtrl_SetWhitespaceForeground, 3073). --define(wxStyledTextCtrl_SetWhitespaceBackground, 3074). --define(wxStyledTextCtrl_GetStyleBits, 3075). --define(wxStyledTextCtrl_SetLineState, 3076). --define(wxStyledTextCtrl_GetLineState, 3077). --define(wxStyledTextCtrl_GetMaxLineState, 3078). --define(wxStyledTextCtrl_GetCaretLineVisible, 3079). --define(wxStyledTextCtrl_SetCaretLineVisible, 3080). --define(wxStyledTextCtrl_GetCaretLineBackground, 3081). --define(wxStyledTextCtrl_SetCaretLineBackground, 3082). --define(wxStyledTextCtrl_AutoCompShow, 3083). --define(wxStyledTextCtrl_AutoCompCancel, 3084). --define(wxStyledTextCtrl_AutoCompActive, 3085). --define(wxStyledTextCtrl_AutoCompPosStart, 3086). --define(wxStyledTextCtrl_AutoCompComplete, 3087). --define(wxStyledTextCtrl_AutoCompStops, 3088). --define(wxStyledTextCtrl_AutoCompSetSeparator, 3089). --define(wxStyledTextCtrl_AutoCompGetSeparator, 3090). --define(wxStyledTextCtrl_AutoCompSelect, 3091). --define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3092). --define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3093). --define(wxStyledTextCtrl_AutoCompSetFillUps, 3094). --define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3095). --define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3096). --define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3097). --define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3098). --define(wxStyledTextCtrl_UserListShow, 3099). --define(wxStyledTextCtrl_AutoCompSetAutoHide, 3100). --define(wxStyledTextCtrl_AutoCompGetAutoHide, 3101). --define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3102). --define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3103). --define(wxStyledTextCtrl_RegisterImage, 3104). --define(wxStyledTextCtrl_ClearRegisteredImages, 3105). --define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3106). --define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3107). --define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3108). --define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3109). --define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3110). --define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3111). --define(wxStyledTextCtrl_SetIndent, 3112). --define(wxStyledTextCtrl_GetIndent, 3113). --define(wxStyledTextCtrl_SetUseTabs, 3114). --define(wxStyledTextCtrl_GetUseTabs, 3115). --define(wxStyledTextCtrl_SetLineIndentation, 3116). --define(wxStyledTextCtrl_GetLineIndentation, 3117). --define(wxStyledTextCtrl_GetLineIndentPosition, 3118). --define(wxStyledTextCtrl_GetColumn, 3119). --define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3120). --define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3121). --define(wxStyledTextCtrl_SetIndentationGuides, 3122). --define(wxStyledTextCtrl_GetIndentationGuides, 3123). --define(wxStyledTextCtrl_SetHighlightGuide, 3124). --define(wxStyledTextCtrl_GetHighlightGuide, 3125). --define(wxStyledTextCtrl_GetLineEndPosition, 3126). --define(wxStyledTextCtrl_GetCodePage, 3127). --define(wxStyledTextCtrl_GetCaretForeground, 3128). --define(wxStyledTextCtrl_GetReadOnly, 3129). --define(wxStyledTextCtrl_SetCurrentPos, 3130). --define(wxStyledTextCtrl_SetSelectionStart, 3131). --define(wxStyledTextCtrl_GetSelectionStart, 3132). --define(wxStyledTextCtrl_SetSelectionEnd, 3133). --define(wxStyledTextCtrl_GetSelectionEnd, 3134). --define(wxStyledTextCtrl_SetPrintMagnification, 3135). --define(wxStyledTextCtrl_GetPrintMagnification, 3136). --define(wxStyledTextCtrl_SetPrintColourMode, 3137). --define(wxStyledTextCtrl_GetPrintColourMode, 3138). --define(wxStyledTextCtrl_FindText, 3139). --define(wxStyledTextCtrl_FormatRange, 3140). --define(wxStyledTextCtrl_GetFirstVisibleLine, 3141). --define(wxStyledTextCtrl_GetLine, 3142). --define(wxStyledTextCtrl_GetLineCount, 3143). --define(wxStyledTextCtrl_SetMarginLeft, 3144). --define(wxStyledTextCtrl_GetMarginLeft, 3145). --define(wxStyledTextCtrl_SetMarginRight, 3146). --define(wxStyledTextCtrl_GetMarginRight, 3147). --define(wxStyledTextCtrl_GetModify, 3148). --define(wxStyledTextCtrl_SetSelection, 3149). --define(wxStyledTextCtrl_GetSelectedText, 3150). --define(wxStyledTextCtrl_GetTextRange, 3151). --define(wxStyledTextCtrl_HideSelection, 3152). --define(wxStyledTextCtrl_LineFromPosition, 3153). --define(wxStyledTextCtrl_PositionFromLine, 3154). --define(wxStyledTextCtrl_LineScroll, 3155). --define(wxStyledTextCtrl_EnsureCaretVisible, 3156). --define(wxStyledTextCtrl_ReplaceSelection, 3157). --define(wxStyledTextCtrl_SetReadOnly, 3158). --define(wxStyledTextCtrl_CanPaste, 3159). --define(wxStyledTextCtrl_CanUndo, 3160). --define(wxStyledTextCtrl_EmptyUndoBuffer, 3161). --define(wxStyledTextCtrl_Undo, 3162). --define(wxStyledTextCtrl_Cut, 3163). --define(wxStyledTextCtrl_Copy, 3164). --define(wxStyledTextCtrl_Paste, 3165). --define(wxStyledTextCtrl_Clear, 3166). --define(wxStyledTextCtrl_SetText, 3167). --define(wxStyledTextCtrl_GetText, 3168). --define(wxStyledTextCtrl_GetTextLength, 3169). --define(wxStyledTextCtrl_GetOvertype, 3170). --define(wxStyledTextCtrl_SetCaretWidth, 3171). --define(wxStyledTextCtrl_GetCaretWidth, 3172). --define(wxStyledTextCtrl_SetTargetStart, 3173). --define(wxStyledTextCtrl_GetTargetStart, 3174). --define(wxStyledTextCtrl_SetTargetEnd, 3175). --define(wxStyledTextCtrl_GetTargetEnd, 3176). --define(wxStyledTextCtrl_ReplaceTarget, 3177). --define(wxStyledTextCtrl_SearchInTarget, 3178). --define(wxStyledTextCtrl_SetSearchFlags, 3179). --define(wxStyledTextCtrl_GetSearchFlags, 3180). --define(wxStyledTextCtrl_CallTipShow, 3181). --define(wxStyledTextCtrl_CallTipCancel, 3182). --define(wxStyledTextCtrl_CallTipActive, 3183). --define(wxStyledTextCtrl_CallTipPosAtStart, 3184). --define(wxStyledTextCtrl_CallTipSetHighlight, 3185). --define(wxStyledTextCtrl_CallTipSetBackground, 3186). --define(wxStyledTextCtrl_CallTipSetForeground, 3187). --define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3188). --define(wxStyledTextCtrl_CallTipUseStyle, 3189). --define(wxStyledTextCtrl_VisibleFromDocLine, 3190). --define(wxStyledTextCtrl_DocLineFromVisible, 3191). --define(wxStyledTextCtrl_WrapCount, 3192). --define(wxStyledTextCtrl_SetFoldLevel, 3193). --define(wxStyledTextCtrl_GetFoldLevel, 3194). --define(wxStyledTextCtrl_GetLastChild, 3195). --define(wxStyledTextCtrl_GetFoldParent, 3196). --define(wxStyledTextCtrl_ShowLines, 3197). --define(wxStyledTextCtrl_HideLines, 3198). --define(wxStyledTextCtrl_GetLineVisible, 3199). --define(wxStyledTextCtrl_SetFoldExpanded, 3200). --define(wxStyledTextCtrl_GetFoldExpanded, 3201). --define(wxStyledTextCtrl_ToggleFold, 3202). --define(wxStyledTextCtrl_EnsureVisible, 3203). --define(wxStyledTextCtrl_SetFoldFlags, 3204). --define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3205). --define(wxStyledTextCtrl_SetTabIndents, 3206). --define(wxStyledTextCtrl_GetTabIndents, 3207). --define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3208). --define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3209). --define(wxStyledTextCtrl_SetMouseDwellTime, 3210). --define(wxStyledTextCtrl_GetMouseDwellTime, 3211). --define(wxStyledTextCtrl_WordStartPosition, 3212). --define(wxStyledTextCtrl_WordEndPosition, 3213). --define(wxStyledTextCtrl_SetWrapMode, 3214). --define(wxStyledTextCtrl_GetWrapMode, 3215). --define(wxStyledTextCtrl_SetWrapVisualFlags, 3216). --define(wxStyledTextCtrl_GetWrapVisualFlags, 3217). --define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3218). --define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3219). --define(wxStyledTextCtrl_SetWrapStartIndent, 3220). --define(wxStyledTextCtrl_GetWrapStartIndent, 3221). --define(wxStyledTextCtrl_SetLayoutCache, 3222). --define(wxStyledTextCtrl_GetLayoutCache, 3223). --define(wxStyledTextCtrl_SetScrollWidth, 3224). --define(wxStyledTextCtrl_GetScrollWidth, 3225). --define(wxStyledTextCtrl_TextWidth, 3226). --define(wxStyledTextCtrl_GetEndAtLastLine, 3227). --define(wxStyledTextCtrl_TextHeight, 3228). --define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3229). --define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3230). --define(wxStyledTextCtrl_AppendText, 3231). --define(wxStyledTextCtrl_GetTwoPhaseDraw, 3232). --define(wxStyledTextCtrl_SetTwoPhaseDraw, 3233). --define(wxStyledTextCtrl_TargetFromSelection, 3234). --define(wxStyledTextCtrl_LinesJoin, 3235). --define(wxStyledTextCtrl_LinesSplit, 3236). --define(wxStyledTextCtrl_SetFoldMarginColour, 3237). --define(wxStyledTextCtrl_SetFoldMarginHiColour, 3238). --define(wxStyledTextCtrl_LineDown, 3239). --define(wxStyledTextCtrl_LineDownExtend, 3240). --define(wxStyledTextCtrl_LineUp, 3241). --define(wxStyledTextCtrl_LineUpExtend, 3242). --define(wxStyledTextCtrl_CharLeft, 3243). --define(wxStyledTextCtrl_CharLeftExtend, 3244). --define(wxStyledTextCtrl_CharRight, 3245). --define(wxStyledTextCtrl_CharRightExtend, 3246). --define(wxStyledTextCtrl_WordLeft, 3247). --define(wxStyledTextCtrl_WordLeftExtend, 3248). --define(wxStyledTextCtrl_WordRight, 3249). --define(wxStyledTextCtrl_WordRightExtend, 3250). --define(wxStyledTextCtrl_Home, 3251). --define(wxStyledTextCtrl_HomeExtend, 3252). --define(wxStyledTextCtrl_LineEnd, 3253). --define(wxStyledTextCtrl_LineEndExtend, 3254). --define(wxStyledTextCtrl_DocumentStart, 3255). --define(wxStyledTextCtrl_DocumentStartExtend, 3256). --define(wxStyledTextCtrl_DocumentEnd, 3257). --define(wxStyledTextCtrl_DocumentEndExtend, 3258). --define(wxStyledTextCtrl_PageUp, 3259). --define(wxStyledTextCtrl_PageUpExtend, 3260). --define(wxStyledTextCtrl_PageDown, 3261). --define(wxStyledTextCtrl_PageDownExtend, 3262). --define(wxStyledTextCtrl_EditToggleOvertype, 3263). --define(wxStyledTextCtrl_Cancel, 3264). --define(wxStyledTextCtrl_DeleteBack, 3265). --define(wxStyledTextCtrl_Tab, 3266). --define(wxStyledTextCtrl_BackTab, 3267). --define(wxStyledTextCtrl_NewLine, 3268). --define(wxStyledTextCtrl_FormFeed, 3269). --define(wxStyledTextCtrl_VCHome, 3270). --define(wxStyledTextCtrl_VCHomeExtend, 3271). --define(wxStyledTextCtrl_ZoomIn, 3272). --define(wxStyledTextCtrl_ZoomOut, 3273). --define(wxStyledTextCtrl_DelWordLeft, 3274). --define(wxStyledTextCtrl_DelWordRight, 3275). --define(wxStyledTextCtrl_LineCut, 3276). --define(wxStyledTextCtrl_LineDelete, 3277). --define(wxStyledTextCtrl_LineTranspose, 3278). --define(wxStyledTextCtrl_LineDuplicate, 3279). --define(wxStyledTextCtrl_LowerCase, 3280). --define(wxStyledTextCtrl_UpperCase, 3281). --define(wxStyledTextCtrl_LineScrollDown, 3282). --define(wxStyledTextCtrl_LineScrollUp, 3283). --define(wxStyledTextCtrl_DeleteBackNotLine, 3284). --define(wxStyledTextCtrl_HomeDisplay, 3285). --define(wxStyledTextCtrl_HomeDisplayExtend, 3286). --define(wxStyledTextCtrl_LineEndDisplay, 3287). --define(wxStyledTextCtrl_LineEndDisplayExtend, 3288). --define(wxStyledTextCtrl_HomeWrapExtend, 3289). --define(wxStyledTextCtrl_LineEndWrap, 3290). --define(wxStyledTextCtrl_LineEndWrapExtend, 3291). --define(wxStyledTextCtrl_VCHomeWrap, 3292). --define(wxStyledTextCtrl_VCHomeWrapExtend, 3293). --define(wxStyledTextCtrl_LineCopy, 3294). --define(wxStyledTextCtrl_MoveCaretInsideView, 3295). --define(wxStyledTextCtrl_LineLength, 3296). --define(wxStyledTextCtrl_BraceHighlight, 3297). --define(wxStyledTextCtrl_BraceBadLight, 3298). --define(wxStyledTextCtrl_BraceMatch, 3299). --define(wxStyledTextCtrl_GetViewEOL, 3300). --define(wxStyledTextCtrl_SetViewEOL, 3301). --define(wxStyledTextCtrl_SetModEventMask, 3302). --define(wxStyledTextCtrl_GetEdgeColumn, 3303). --define(wxStyledTextCtrl_SetEdgeColumn, 3304). --define(wxStyledTextCtrl_SetEdgeMode, 3305). --define(wxStyledTextCtrl_GetEdgeMode, 3306). --define(wxStyledTextCtrl_GetEdgeColour, 3307). --define(wxStyledTextCtrl_SetEdgeColour, 3308). --define(wxStyledTextCtrl_SearchAnchor, 3309). --define(wxStyledTextCtrl_SearchNext, 3310). --define(wxStyledTextCtrl_SearchPrev, 3311). --define(wxStyledTextCtrl_LinesOnScreen, 3312). --define(wxStyledTextCtrl_UsePopUp, 3313). --define(wxStyledTextCtrl_SelectionIsRectangle, 3314). --define(wxStyledTextCtrl_SetZoom, 3315). --define(wxStyledTextCtrl_GetZoom, 3316). --define(wxStyledTextCtrl_GetModEventMask, 3317). --define(wxStyledTextCtrl_SetSTCFocus, 3318). --define(wxStyledTextCtrl_GetSTCFocus, 3319). --define(wxStyledTextCtrl_SetStatus, 3320). --define(wxStyledTextCtrl_GetStatus, 3321). --define(wxStyledTextCtrl_SetMouseDownCaptures, 3322). --define(wxStyledTextCtrl_GetMouseDownCaptures, 3323). --define(wxStyledTextCtrl_SetSTCCursor, 3324). --define(wxStyledTextCtrl_GetSTCCursor, 3325). --define(wxStyledTextCtrl_SetControlCharSymbol, 3326). --define(wxStyledTextCtrl_GetControlCharSymbol, 3327). --define(wxStyledTextCtrl_WordPartLeft, 3328). --define(wxStyledTextCtrl_WordPartLeftExtend, 3329). --define(wxStyledTextCtrl_WordPartRight, 3330). --define(wxStyledTextCtrl_WordPartRightExtend, 3331). --define(wxStyledTextCtrl_SetVisiblePolicy, 3332). --define(wxStyledTextCtrl_DelLineLeft, 3333). --define(wxStyledTextCtrl_DelLineRight, 3334). --define(wxStyledTextCtrl_GetXOffset, 3335). --define(wxStyledTextCtrl_ChooseCaretX, 3336). --define(wxStyledTextCtrl_SetXCaretPolicy, 3337). --define(wxStyledTextCtrl_SetYCaretPolicy, 3338). --define(wxStyledTextCtrl_GetPrintWrapMode, 3339). --define(wxStyledTextCtrl_SetHotspotActiveForeground, 3340). --define(wxStyledTextCtrl_SetHotspotActiveBackground, 3341). --define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3342). --define(wxStyledTextCtrl_SetHotspotSingleLine, 3343). --define(wxStyledTextCtrl_ParaDownExtend, 3344). --define(wxStyledTextCtrl_ParaUp, 3345). --define(wxStyledTextCtrl_ParaUpExtend, 3346). --define(wxStyledTextCtrl_PositionBefore, 3347). --define(wxStyledTextCtrl_PositionAfter, 3348). --define(wxStyledTextCtrl_CopyRange, 3349). --define(wxStyledTextCtrl_CopyText, 3350). --define(wxStyledTextCtrl_SetSelectionMode, 3351). --define(wxStyledTextCtrl_GetSelectionMode, 3352). --define(wxStyledTextCtrl_LineDownRectExtend, 3353). --define(wxStyledTextCtrl_LineUpRectExtend, 3354). --define(wxStyledTextCtrl_CharLeftRectExtend, 3355). --define(wxStyledTextCtrl_CharRightRectExtend, 3356). --define(wxStyledTextCtrl_HomeRectExtend, 3357). --define(wxStyledTextCtrl_VCHomeRectExtend, 3358). --define(wxStyledTextCtrl_LineEndRectExtend, 3359). --define(wxStyledTextCtrl_PageUpRectExtend, 3360). --define(wxStyledTextCtrl_PageDownRectExtend, 3361). --define(wxStyledTextCtrl_StutteredPageUp, 3362). --define(wxStyledTextCtrl_StutteredPageUpExtend, 3363). --define(wxStyledTextCtrl_StutteredPageDown, 3364). --define(wxStyledTextCtrl_StutteredPageDownExtend, 3365). --define(wxStyledTextCtrl_WordLeftEnd, 3366). --define(wxStyledTextCtrl_WordLeftEndExtend, 3367). --define(wxStyledTextCtrl_WordRightEnd, 3368). --define(wxStyledTextCtrl_WordRightEndExtend, 3369). --define(wxStyledTextCtrl_SetWhitespaceChars, 3370). --define(wxStyledTextCtrl_SetCharsDefault, 3371). --define(wxStyledTextCtrl_AutoCompGetCurrent, 3372). --define(wxStyledTextCtrl_Allocate, 3373). --define(wxStyledTextCtrl_FindColumn, 3374). --define(wxStyledTextCtrl_GetCaretSticky, 3375). --define(wxStyledTextCtrl_SetCaretSticky, 3376). --define(wxStyledTextCtrl_ToggleCaretSticky, 3377). --define(wxStyledTextCtrl_SetPasteConvertEndings, 3378). --define(wxStyledTextCtrl_GetPasteConvertEndings, 3379). --define(wxStyledTextCtrl_SelectionDuplicate, 3380). --define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3381). --define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3382). --define(wxStyledTextCtrl_StartRecord, 3383). --define(wxStyledTextCtrl_StopRecord, 3384). --define(wxStyledTextCtrl_SetLexer, 3385). --define(wxStyledTextCtrl_GetLexer, 3386). --define(wxStyledTextCtrl_Colourise, 3387). --define(wxStyledTextCtrl_SetProperty, 3388). --define(wxStyledTextCtrl_SetKeyWords, 3389). --define(wxStyledTextCtrl_SetLexerLanguage, 3390). --define(wxStyledTextCtrl_GetProperty, 3391). --define(wxStyledTextCtrl_GetStyleBitsNeeded, 3392). --define(wxStyledTextCtrl_GetCurrentLine, 3393). --define(wxStyledTextCtrl_StyleSetSpec, 3394). --define(wxStyledTextCtrl_StyleSetFont, 3395). --define(wxStyledTextCtrl_StyleSetFontAttr, 3396). --define(wxStyledTextCtrl_StyleSetCharacterSet, 3397). --define(wxStyledTextCtrl_StyleSetFontEncoding, 3398). --define(wxStyledTextCtrl_CmdKeyExecute, 3399). --define(wxStyledTextCtrl_SetMargins, 3400). --define(wxStyledTextCtrl_GetSelection, 3401). --define(wxStyledTextCtrl_PointFromPosition, 3402). --define(wxStyledTextCtrl_ScrollToLine, 3403). --define(wxStyledTextCtrl_ScrollToColumn, 3404). --define(wxStyledTextCtrl_SetVScrollBar, 3405). --define(wxStyledTextCtrl_SetHScrollBar, 3406). --define(wxStyledTextCtrl_GetLastKeydownProcessed, 3407). --define(wxStyledTextCtrl_SetLastKeydownProcessed, 3408). --define(wxStyledTextCtrl_SaveFile, 3409). --define(wxStyledTextCtrl_LoadFile, 3410). --define(wxStyledTextCtrl_DoDragOver, 3411). --define(wxStyledTextCtrl_DoDropText, 3412). --define(wxStyledTextCtrl_GetUseAntiAliasing, 3413). --define(wxStyledTextCtrl_AddTextRaw, 3414). --define(wxStyledTextCtrl_InsertTextRaw, 3415). --define(wxStyledTextCtrl_GetCurLineRaw, 3416). --define(wxStyledTextCtrl_GetLineRaw, 3417). --define(wxStyledTextCtrl_GetSelectedTextRaw, 3418). --define(wxStyledTextCtrl_GetTextRangeRaw, 3419). --define(wxStyledTextCtrl_SetTextRaw, 3420). --define(wxStyledTextCtrl_GetTextRaw, 3421). --define(wxStyledTextCtrl_AppendTextRaw, 3422). --define(wxArtProvider_GetBitmap, 3423). --define(wxArtProvider_GetIcon, 3424). --define(wxTreeEvent_GetKeyCode, 3425). --define(wxTreeEvent_GetItem, 3426). --define(wxTreeEvent_GetKeyEvent, 3427). --define(wxTreeEvent_GetLabel, 3428). --define(wxTreeEvent_GetOldItem, 3429). --define(wxTreeEvent_GetPoint, 3430). --define(wxTreeEvent_IsEditCancelled, 3431). --define(wxTreeEvent_SetToolTip, 3432). --define(wxNotebookEvent_GetOldSelection, 3433). --define(wxNotebookEvent_GetSelection, 3434). --define(wxNotebookEvent_SetOldSelection, 3435). --define(wxNotebookEvent_SetSelection, 3436). --define(wxFileDataObject_new, 3437). --define(wxFileDataObject_AddFile, 3438). --define(wxFileDataObject_GetFilenames, 3439). --define(wxFileDataObject_destroy, 3440). --define(wxTextDataObject_new, 3441). --define(wxTextDataObject_GetTextLength, 3442). --define(wxTextDataObject_GetText, 3443). --define(wxTextDataObject_SetText, 3444). --define(wxTextDataObject_destroy, 3445). --define(wxBitmapDataObject_new_1_1, 3446). --define(wxBitmapDataObject_new_1_0, 3447). --define(wxBitmapDataObject_GetBitmap, 3448). --define(wxBitmapDataObject_SetBitmap, 3449). --define(wxBitmapDataObject_destroy, 3450). --define(wxClipboard_new, 3452). --define(wxClipboard_destruct, 3453). --define(wxClipboard_AddData, 3454). --define(wxClipboard_Clear, 3455). --define(wxClipboard_Close, 3456). --define(wxClipboard_Flush, 3457). --define(wxClipboard_GetData, 3458). --define(wxClipboard_IsOpened, 3459). --define(wxClipboard_Open, 3460). --define(wxClipboard_SetData, 3461). --define(wxClipboard_UsePrimarySelection, 3463). --define(wxClipboard_IsSupported, 3464). --define(wxClipboard_Get, 3465). --define(wxSpinEvent_GetPosition, 3466). --define(wxSpinEvent_SetPosition, 3467). --define(wxSplitterWindow_new_0, 3468). --define(wxSplitterWindow_new_2, 3469). --define(wxSplitterWindow_destruct, 3470). --define(wxSplitterWindow_Create, 3471). --define(wxSplitterWindow_GetMinimumPaneSize, 3472). --define(wxSplitterWindow_GetSashGravity, 3473). --define(wxSplitterWindow_GetSashPosition, 3474). --define(wxSplitterWindow_GetSplitMode, 3475). --define(wxSplitterWindow_GetWindow1, 3476). --define(wxSplitterWindow_GetWindow2, 3477). --define(wxSplitterWindow_Initialize, 3478). --define(wxSplitterWindow_IsSplit, 3479). --define(wxSplitterWindow_ReplaceWindow, 3480). --define(wxSplitterWindow_SetSashGravity, 3481). --define(wxSplitterWindow_SetSashPosition, 3482). --define(wxSplitterWindow_SetSashSize, 3483). --define(wxSplitterWindow_SetMinimumPaneSize, 3484). --define(wxSplitterWindow_SetSplitMode, 3485). --define(wxSplitterWindow_SplitHorizontally, 3486). --define(wxSplitterWindow_SplitVertically, 3487). --define(wxSplitterWindow_Unsplit, 3488). --define(wxSplitterWindow_UpdateSize, 3489). --define(wxSplitterEvent_GetSashPosition, 3490). --define(wxSplitterEvent_GetX, 3491). --define(wxSplitterEvent_GetY, 3492). --define(wxSplitterEvent_GetWindowBeingRemoved, 3493). --define(wxSplitterEvent_SetSashPosition, 3494). --define(wxHtmlWindow_new_0, 3495). --define(wxHtmlWindow_new_2, 3496). --define(wxHtmlWindow_AppendToPage, 3497). --define(wxHtmlWindow_GetOpenedAnchor, 3498). --define(wxHtmlWindow_GetOpenedPage, 3499). --define(wxHtmlWindow_GetOpenedPageTitle, 3500). --define(wxHtmlWindow_GetRelatedFrame, 3501). --define(wxHtmlWindow_HistoryBack, 3502). --define(wxHtmlWindow_HistoryCanBack, 3503). --define(wxHtmlWindow_HistoryCanForward, 3504). --define(wxHtmlWindow_HistoryClear, 3505). --define(wxHtmlWindow_HistoryForward, 3506). --define(wxHtmlWindow_LoadFile, 3507). --define(wxHtmlWindow_LoadPage, 3508). --define(wxHtmlWindow_SelectAll, 3509). --define(wxHtmlWindow_SelectionToText, 3510). --define(wxHtmlWindow_SelectLine, 3511). --define(wxHtmlWindow_SelectWord, 3512). --define(wxHtmlWindow_SetBorders, 3513). --define(wxHtmlWindow_SetFonts, 3514). --define(wxHtmlWindow_SetPage, 3515). --define(wxHtmlWindow_SetRelatedFrame, 3516). --define(wxHtmlWindow_SetRelatedStatusBar, 3517). --define(wxHtmlWindow_ToText, 3518). --define(wxHtmlWindow_destroy, 3519). --define(wxHtmlLinkEvent_GetLinkInfo, 3520). --define(wxSystemSettings_GetColour, 3521). --define(wxSystemSettings_GetFont, 3522). --define(wxSystemSettings_GetMetric, 3523). --define(wxSystemSettings_GetScreenType, 3524). --define(wxSystemOptions_GetOption, 3525). --define(wxSystemOptions_GetOptionInt, 3526). --define(wxSystemOptions_HasOption, 3527). --define(wxSystemOptions_IsFalse, 3528). --define(wxSystemOptions_SetOption_2_1, 3529). --define(wxSystemOptions_SetOption_2_0, 3530). --define(wxAuiNotebookEvent_SetSelection, 3531). --define(wxAuiNotebookEvent_GetSelection, 3532). --define(wxAuiNotebookEvent_SetOldSelection, 3533). --define(wxAuiNotebookEvent_GetOldSelection, 3534). --define(wxAuiNotebookEvent_SetDragSource, 3535). --define(wxAuiNotebookEvent_GetDragSource, 3536). --define(wxAuiManagerEvent_SetManager, 3537). --define(wxAuiManagerEvent_GetManager, 3538). --define(wxAuiManagerEvent_SetPane, 3539). --define(wxAuiManagerEvent_GetPane, 3540). --define(wxAuiManagerEvent_SetButton, 3541). --define(wxAuiManagerEvent_GetButton, 3542). --define(wxAuiManagerEvent_SetDC, 3543). --define(wxAuiManagerEvent_GetDC, 3544). --define(wxAuiManagerEvent_Veto, 3545). --define(wxAuiManagerEvent_GetVeto, 3546). --define(wxAuiManagerEvent_SetCanVeto, 3547). --define(wxAuiManagerEvent_CanVeto, 3548). --define(wxLogNull_new, 3549). --define(wxLogNull_destroy, 3550). --define(wxTaskBarIcon_new, 3551). --define(wxTaskBarIcon_destruct, 3552). --define(wxTaskBarIcon_PopupMenu, 3553). --define(wxTaskBarIcon_RemoveIcon, 3554). --define(wxTaskBarIcon_SetIcon, 3555). --define(wxLocale_new_0, 3556). --define(wxLocale_new_2, 3558). --define(wxLocale_destruct, 3559). --define(wxLocale_Init, 3561). --define(wxLocale_AddCatalog_1, 3562). --define(wxLocale_AddCatalog_3, 3563). --define(wxLocale_AddCatalogLookupPathPrefix, 3564). --define(wxLocale_GetCanonicalName, 3565). --define(wxLocale_GetLanguage, 3566). --define(wxLocale_GetLanguageName, 3567). --define(wxLocale_GetLocale, 3568). --define(wxLocale_GetName, 3569). --define(wxLocale_GetString_2, 3570). --define(wxLocale_GetString_4, 3571). --define(wxLocale_GetHeaderValue, 3572). --define(wxLocale_GetSysName, 3573). --define(wxLocale_GetSystemEncoding, 3574). --define(wxLocale_GetSystemEncodingName, 3575). --define(wxLocale_GetSystemLanguage, 3576). --define(wxLocale_IsLoaded, 3577). --define(wxLocale_IsOk, 3578). --define(wxActivateEvent_GetActive, 3579). --define(wxPopupWindow_new_2, 3581). --define(wxPopupWindow_new_0, 3582). --define(wxPopupWindow_destruct, 3584). --define(wxPopupWindow_Create, 3585). --define(wxPopupWindow_Position, 3586). --define(wxPopupTransientWindow_new_0, 3587). --define(wxPopupTransientWindow_new_2, 3588). --define(wxPopupTransientWindow_destruct, 3589). --define(wxPopupTransientWindow_Popup, 3590). --define(wxPopupTransientWindow_Dismiss, 3591). --define(wxOverlay_new, 3592). --define(wxOverlay_destruct, 3593). --define(wxOverlay_Reset, 3594). --define(wxDCOverlay_new_6, 3595). --define(wxDCOverlay_new_2, 3596). --define(wxDCOverlay_destruct, 3597). --define(wxDCOverlay_Clear, 3598). +-define(wxGauge_GetRange, 1605). +-define(wxGauge_GetValue, 1606). +-define(wxGauge_IsVertical, 1607). +-define(wxGauge_SetRange, 1608). +-define(wxGauge_SetValue, 1609). +-define(wxGauge_Pulse, 1610). +-define(wxGauge_destroy, 1611). +-define(wxGenericDirCtrl_new_0, 1612). +-define(wxGenericDirCtrl_new_2, 1613). +-define(wxGenericDirCtrl_destruct, 1614). +-define(wxGenericDirCtrl_Create, 1615). +-define(wxGenericDirCtrl_Init, 1616). +-define(wxGenericDirCtrl_CollapseTree, 1617). +-define(wxGenericDirCtrl_ExpandPath, 1618). +-define(wxGenericDirCtrl_GetDefaultPath, 1619). +-define(wxGenericDirCtrl_GetPath, 1620). +-define(wxGenericDirCtrl_GetFilePath, 1621). +-define(wxGenericDirCtrl_GetFilter, 1622). +-define(wxGenericDirCtrl_GetFilterIndex, 1623). +-define(wxGenericDirCtrl_GetRootId, 1624). +-define(wxGenericDirCtrl_GetTreeCtrl, 1625). +-define(wxGenericDirCtrl_ReCreateTree, 1626). +-define(wxGenericDirCtrl_SetDefaultPath, 1627). +-define(wxGenericDirCtrl_SetFilter, 1628). +-define(wxGenericDirCtrl_SetFilterIndex, 1629). +-define(wxGenericDirCtrl_SetPath, 1630). +-define(wxStaticBox_new_4, 1632). +-define(wxStaticBox_new_0, 1633). +-define(wxStaticBox_Create, 1634). +-define(wxStaticBox_destroy, 1635). +-define(wxStaticLine_new_2, 1637). +-define(wxStaticLine_new_0, 1638). +-define(wxStaticLine_Create, 1639). +-define(wxStaticLine_IsVertical, 1640). +-define(wxStaticLine_GetDefaultSize, 1641). +-define(wxStaticLine_destroy, 1642). +-define(wxListBox_new_3, 1645). +-define(wxListBox_new_0, 1646). +-define(wxListBox_destruct, 1648). +-define(wxListBox_Create, 1650). +-define(wxListBox_Deselect, 1651). +-define(wxListBox_GetSelections, 1652). +-define(wxListBox_InsertItems, 1653). +-define(wxListBox_IsSelected, 1654). +-define(wxListBox_Set, 1655). +-define(wxListBox_HitTest, 1656). +-define(wxListBox_SetFirstItem_1_0, 1657). +-define(wxListBox_SetFirstItem_1_1, 1658). +-define(wxListCtrl_new_0, 1659). +-define(wxListCtrl_new_2, 1660). +-define(wxListCtrl_Arrange, 1661). +-define(wxListCtrl_AssignImageList, 1662). +-define(wxListCtrl_ClearAll, 1663). +-define(wxListCtrl_Create, 1664). +-define(wxListCtrl_DeleteAllItems, 1665). +-define(wxListCtrl_DeleteColumn, 1666). +-define(wxListCtrl_DeleteItem, 1667). +-define(wxListCtrl_EditLabel, 1668). +-define(wxListCtrl_EnsureVisible, 1669). +-define(wxListCtrl_FindItem_3_0, 1670). +-define(wxListCtrl_FindItem_3_1, 1671). +-define(wxListCtrl_GetColumn, 1672). +-define(wxListCtrl_GetColumnCount, 1673). +-define(wxListCtrl_GetColumnWidth, 1674). +-define(wxListCtrl_GetCountPerPage, 1675). +-define(wxListCtrl_GetEditControl, 1676). +-define(wxListCtrl_GetImageList, 1677). +-define(wxListCtrl_GetItem, 1678). +-define(wxListCtrl_GetItemBackgroundColour, 1679). +-define(wxListCtrl_GetItemCount, 1680). +-define(wxListCtrl_GetItemData, 1681). +-define(wxListCtrl_GetItemFont, 1682). +-define(wxListCtrl_GetItemPosition, 1683). +-define(wxListCtrl_GetItemRect, 1684). +-define(wxListCtrl_GetItemSpacing, 1685). +-define(wxListCtrl_GetItemState, 1686). +-define(wxListCtrl_GetItemText, 1687). +-define(wxListCtrl_GetItemTextColour, 1688). +-define(wxListCtrl_GetNextItem, 1689). +-define(wxListCtrl_GetSelectedItemCount, 1690). +-define(wxListCtrl_GetTextColour, 1691). +-define(wxListCtrl_GetTopItem, 1692). +-define(wxListCtrl_GetViewRect, 1693). +-define(wxListCtrl_HitTest, 1694). +-define(wxListCtrl_InsertColumn_2, 1695). +-define(wxListCtrl_InsertColumn_3, 1696). +-define(wxListCtrl_InsertItem_1, 1697). +-define(wxListCtrl_InsertItem_2_1, 1698). +-define(wxListCtrl_InsertItem_2_0, 1699). +-define(wxListCtrl_InsertItem_3, 1700). +-define(wxListCtrl_RefreshItem, 1701). +-define(wxListCtrl_RefreshItems, 1702). +-define(wxListCtrl_ScrollList, 1703). +-define(wxListCtrl_SetBackgroundColour, 1704). +-define(wxListCtrl_SetColumn, 1705). +-define(wxListCtrl_SetColumnWidth, 1706). +-define(wxListCtrl_SetImageList, 1707). +-define(wxListCtrl_SetItem_1, 1708). +-define(wxListCtrl_SetItem_4, 1709). +-define(wxListCtrl_SetItemBackgroundColour, 1710). +-define(wxListCtrl_SetItemCount, 1711). +-define(wxListCtrl_SetItemData, 1712). +-define(wxListCtrl_SetItemFont, 1713). +-define(wxListCtrl_SetItemImage, 1714). +-define(wxListCtrl_SetItemColumnImage, 1715). +-define(wxListCtrl_SetItemPosition, 1716). +-define(wxListCtrl_SetItemState, 1717). +-define(wxListCtrl_SetItemText, 1718). +-define(wxListCtrl_SetItemTextColour, 1719). +-define(wxListCtrl_SetSingleStyle, 1720). +-define(wxListCtrl_SetTextColour, 1721). +-define(wxListCtrl_SetWindowStyleFlag, 1722). +-define(wxListCtrl_SortItems, 1723). +-define(wxListCtrl_destroy, 1724). +-define(wxListView_ClearColumnImage, 1725). +-define(wxListView_Focus, 1726). +-define(wxListView_GetFirstSelected, 1727). +-define(wxListView_GetFocusedItem, 1728). +-define(wxListView_GetNextSelected, 1729). +-define(wxListView_IsSelected, 1730). +-define(wxListView_Select, 1731). +-define(wxListView_SetColumnImage, 1732). +-define(wxListItem_new_0, 1733). +-define(wxListItem_new_1, 1734). +-define(wxListItem_destruct, 1735). +-define(wxListItem_Clear, 1736). +-define(wxListItem_GetAlign, 1737). +-define(wxListItem_GetBackgroundColour, 1738). +-define(wxListItem_GetColumn, 1739). +-define(wxListItem_GetFont, 1740). +-define(wxListItem_GetId, 1741). +-define(wxListItem_GetImage, 1742). +-define(wxListItem_GetMask, 1743). +-define(wxListItem_GetState, 1744). +-define(wxListItem_GetText, 1745). +-define(wxListItem_GetTextColour, 1746). +-define(wxListItem_GetWidth, 1747). +-define(wxListItem_SetAlign, 1748). +-define(wxListItem_SetBackgroundColour, 1749). +-define(wxListItem_SetColumn, 1750). +-define(wxListItem_SetFont, 1751). +-define(wxListItem_SetId, 1752). +-define(wxListItem_SetImage, 1753). +-define(wxListItem_SetMask, 1754). +-define(wxListItem_SetState, 1755). +-define(wxListItem_SetStateMask, 1756). +-define(wxListItem_SetText, 1757). +-define(wxListItem_SetTextColour, 1758). +-define(wxListItem_SetWidth, 1759). +-define(wxListItemAttr_new_0, 1760). +-define(wxListItemAttr_new_3, 1761). +-define(wxListItemAttr_GetBackgroundColour, 1762). +-define(wxListItemAttr_GetFont, 1763). +-define(wxListItemAttr_GetTextColour, 1764). +-define(wxListItemAttr_HasBackgroundColour, 1765). +-define(wxListItemAttr_HasFont, 1766). +-define(wxListItemAttr_HasTextColour, 1767). +-define(wxListItemAttr_SetBackgroundColour, 1768). +-define(wxListItemAttr_SetFont, 1769). +-define(wxListItemAttr_SetTextColour, 1770). +-define(wxListItemAttr_destroy, 1771). +-define(wxImageList_new_0, 1772). +-define(wxImageList_new_3, 1773). +-define(wxImageList_Add_1, 1774). +-define(wxImageList_Add_2_0, 1775). +-define(wxImageList_Add_2_1, 1776). +-define(wxImageList_Create, 1777). +-define(wxImageList_Draw, 1779). +-define(wxImageList_GetBitmap, 1780). +-define(wxImageList_GetIcon, 1781). +-define(wxImageList_GetImageCount, 1782). +-define(wxImageList_GetSize, 1783). +-define(wxImageList_Remove, 1784). +-define(wxImageList_RemoveAll, 1785). +-define(wxImageList_Replace_2, 1786). +-define(wxImageList_Replace_3, 1787). +-define(wxImageList_destroy, 1788). +-define(wxTextAttr_new_0, 1789). +-define(wxTextAttr_new_2, 1790). +-define(wxTextAttr_GetAlignment, 1791). +-define(wxTextAttr_GetBackgroundColour, 1792). +-define(wxTextAttr_GetFont, 1793). +-define(wxTextAttr_GetLeftIndent, 1794). +-define(wxTextAttr_GetLeftSubIndent, 1795). +-define(wxTextAttr_GetRightIndent, 1796). +-define(wxTextAttr_GetTabs, 1797). +-define(wxTextAttr_GetTextColour, 1798). +-define(wxTextAttr_HasBackgroundColour, 1799). +-define(wxTextAttr_HasFont, 1800). +-define(wxTextAttr_HasTextColour, 1801). +-define(wxTextAttr_GetFlags, 1802). +-define(wxTextAttr_IsDefault, 1803). +-define(wxTextAttr_SetAlignment, 1804). +-define(wxTextAttr_SetBackgroundColour, 1805). +-define(wxTextAttr_SetFlags, 1806). +-define(wxTextAttr_SetFont, 1807). +-define(wxTextAttr_SetLeftIndent, 1808). +-define(wxTextAttr_SetRightIndent, 1809). +-define(wxTextAttr_SetTabs, 1810). +-define(wxTextAttr_SetTextColour, 1811). +-define(wxTextAttr_destroy, 1812). +-define(wxTextCtrl_new_3, 1814). +-define(wxTextCtrl_new_0, 1815). +-define(wxTextCtrl_destruct, 1817). +-define(wxTextCtrl_AppendText, 1818). +-define(wxTextCtrl_CanCopy, 1819). +-define(wxTextCtrl_CanCut, 1820). +-define(wxTextCtrl_CanPaste, 1821). +-define(wxTextCtrl_CanRedo, 1822). +-define(wxTextCtrl_CanUndo, 1823). +-define(wxTextCtrl_Clear, 1824). +-define(wxTextCtrl_Copy, 1825). +-define(wxTextCtrl_Create, 1826). +-define(wxTextCtrl_Cut, 1827). +-define(wxTextCtrl_DiscardEdits, 1828). +-define(wxTextCtrl_ChangeValue, 1829). +-define(wxTextCtrl_EmulateKeyPress, 1830). +-define(wxTextCtrl_GetDefaultStyle, 1831). +-define(wxTextCtrl_GetInsertionPoint, 1832). +-define(wxTextCtrl_GetLastPosition, 1833). +-define(wxTextCtrl_GetLineLength, 1834). +-define(wxTextCtrl_GetLineText, 1835). +-define(wxTextCtrl_GetNumberOfLines, 1836). +-define(wxTextCtrl_GetRange, 1837). +-define(wxTextCtrl_GetSelection, 1838). +-define(wxTextCtrl_GetStringSelection, 1839). +-define(wxTextCtrl_GetStyle, 1840). +-define(wxTextCtrl_GetValue, 1841). +-define(wxTextCtrl_IsEditable, 1842). +-define(wxTextCtrl_IsModified, 1843). +-define(wxTextCtrl_IsMultiLine, 1844). +-define(wxTextCtrl_IsSingleLine, 1845). +-define(wxTextCtrl_LoadFile, 1846). +-define(wxTextCtrl_MarkDirty, 1847). +-define(wxTextCtrl_Paste, 1848). +-define(wxTextCtrl_PositionToXY, 1849). +-define(wxTextCtrl_Redo, 1850). +-define(wxTextCtrl_Remove, 1851). +-define(wxTextCtrl_Replace, 1852). +-define(wxTextCtrl_SaveFile, 1853). +-define(wxTextCtrl_SetDefaultStyle, 1854). +-define(wxTextCtrl_SetEditable, 1855). +-define(wxTextCtrl_SetInsertionPoint, 1856). +-define(wxTextCtrl_SetInsertionPointEnd, 1857). +-define(wxTextCtrl_SetMaxLength, 1859). +-define(wxTextCtrl_SetSelection, 1860). +-define(wxTextCtrl_SetStyle, 1861). +-define(wxTextCtrl_SetValue, 1862). +-define(wxTextCtrl_ShowPosition, 1863). +-define(wxTextCtrl_Undo, 1864). +-define(wxTextCtrl_WriteText, 1865). +-define(wxTextCtrl_XYToPosition, 1866). +-define(wxNotebook_new_0, 1869). +-define(wxNotebook_new_3, 1870). +-define(wxNotebook_destruct, 1871). +-define(wxNotebook_AddPage, 1872). +-define(wxNotebook_AdvanceSelection, 1873). +-define(wxNotebook_AssignImageList, 1874). +-define(wxNotebook_Create, 1875). +-define(wxNotebook_DeleteAllPages, 1876). +-define(wxNotebook_DeletePage, 1877). +-define(wxNotebook_RemovePage, 1878). +-define(wxNotebook_GetCurrentPage, 1879). +-define(wxNotebook_GetImageList, 1880). +-define(wxNotebook_GetPage, 1882). +-define(wxNotebook_GetPageCount, 1883). +-define(wxNotebook_GetPageImage, 1884). +-define(wxNotebook_GetPageText, 1885). +-define(wxNotebook_GetRowCount, 1886). +-define(wxNotebook_GetSelection, 1887). +-define(wxNotebook_GetThemeBackgroundColour, 1888). +-define(wxNotebook_HitTest, 1890). +-define(wxNotebook_InsertPage, 1892). +-define(wxNotebook_SetImageList, 1893). +-define(wxNotebook_SetPadding, 1894). +-define(wxNotebook_SetPageSize, 1895). +-define(wxNotebook_SetPageImage, 1896). +-define(wxNotebook_SetPageText, 1897). +-define(wxNotebook_SetSelection, 1898). +-define(wxNotebook_ChangeSelection, 1899). +-define(wxChoicebook_new_0, 1900). +-define(wxChoicebook_new_3, 1901). +-define(wxChoicebook_AddPage, 1902). +-define(wxChoicebook_AdvanceSelection, 1903). +-define(wxChoicebook_AssignImageList, 1904). +-define(wxChoicebook_Create, 1905). +-define(wxChoicebook_DeleteAllPages, 1906). +-define(wxChoicebook_DeletePage, 1907). +-define(wxChoicebook_RemovePage, 1908). +-define(wxChoicebook_GetCurrentPage, 1909). +-define(wxChoicebook_GetImageList, 1910). +-define(wxChoicebook_GetPage, 1912). +-define(wxChoicebook_GetPageCount, 1913). +-define(wxChoicebook_GetPageImage, 1914). +-define(wxChoicebook_GetPageText, 1915). +-define(wxChoicebook_GetSelection, 1916). +-define(wxChoicebook_HitTest, 1917). +-define(wxChoicebook_InsertPage, 1918). +-define(wxChoicebook_SetImageList, 1919). +-define(wxChoicebook_SetPageSize, 1920). +-define(wxChoicebook_SetPageImage, 1921). +-define(wxChoicebook_SetPageText, 1922). +-define(wxChoicebook_SetSelection, 1923). +-define(wxChoicebook_ChangeSelection, 1924). +-define(wxChoicebook_destroy, 1925). +-define(wxToolbook_new_0, 1926). +-define(wxToolbook_new_3, 1927). +-define(wxToolbook_AddPage, 1928). +-define(wxToolbook_AdvanceSelection, 1929). +-define(wxToolbook_AssignImageList, 1930). +-define(wxToolbook_Create, 1931). +-define(wxToolbook_DeleteAllPages, 1932). +-define(wxToolbook_DeletePage, 1933). +-define(wxToolbook_RemovePage, 1934). +-define(wxToolbook_GetCurrentPage, 1935). +-define(wxToolbook_GetImageList, 1936). +-define(wxToolbook_GetPage, 1938). +-define(wxToolbook_GetPageCount, 1939). +-define(wxToolbook_GetPageImage, 1940). +-define(wxToolbook_GetPageText, 1941). +-define(wxToolbook_GetSelection, 1942). +-define(wxToolbook_HitTest, 1944). +-define(wxToolbook_InsertPage, 1945). +-define(wxToolbook_SetImageList, 1946). +-define(wxToolbook_SetPageSize, 1947). +-define(wxToolbook_SetPageImage, 1948). +-define(wxToolbook_SetPageText, 1949). +-define(wxToolbook_SetSelection, 1950). +-define(wxToolbook_ChangeSelection, 1951). +-define(wxToolbook_destroy, 1952). +-define(wxListbook_new_0, 1953). +-define(wxListbook_new_3, 1954). +-define(wxListbook_AddPage, 1955). +-define(wxListbook_AdvanceSelection, 1956). +-define(wxListbook_AssignImageList, 1957). +-define(wxListbook_Create, 1958). +-define(wxListbook_DeleteAllPages, 1959). +-define(wxListbook_DeletePage, 1960). +-define(wxListbook_RemovePage, 1961). +-define(wxListbook_GetCurrentPage, 1962). +-define(wxListbook_GetImageList, 1963). +-define(wxListbook_GetPage, 1965). +-define(wxListbook_GetPageCount, 1966). +-define(wxListbook_GetPageImage, 1967). +-define(wxListbook_GetPageText, 1968). +-define(wxListbook_GetSelection, 1969). +-define(wxListbook_HitTest, 1971). +-define(wxListbook_InsertPage, 1972). +-define(wxListbook_SetImageList, 1973). +-define(wxListbook_SetPageSize, 1974). +-define(wxListbook_SetPageImage, 1975). +-define(wxListbook_SetPageText, 1976). +-define(wxListbook_SetSelection, 1977). +-define(wxListbook_ChangeSelection, 1978). +-define(wxListbook_destroy, 1979). +-define(wxTreebook_new_0, 1980). +-define(wxTreebook_new_3, 1981). +-define(wxTreebook_AddPage, 1982). +-define(wxTreebook_AdvanceSelection, 1983). +-define(wxTreebook_AssignImageList, 1984). +-define(wxTreebook_Create, 1985). +-define(wxTreebook_DeleteAllPages, 1986). +-define(wxTreebook_DeletePage, 1987). +-define(wxTreebook_RemovePage, 1988). +-define(wxTreebook_GetCurrentPage, 1989). +-define(wxTreebook_GetImageList, 1990). +-define(wxTreebook_GetPage, 1992). +-define(wxTreebook_GetPageCount, 1993). +-define(wxTreebook_GetPageImage, 1994). +-define(wxTreebook_GetPageText, 1995). +-define(wxTreebook_GetSelection, 1996). +-define(wxTreebook_ExpandNode, 1997). +-define(wxTreebook_IsNodeExpanded, 1998). +-define(wxTreebook_HitTest, 2000). +-define(wxTreebook_InsertPage, 2001). +-define(wxTreebook_InsertSubPage, 2002). +-define(wxTreebook_SetImageList, 2003). +-define(wxTreebook_SetPageSize, 2004). +-define(wxTreebook_SetPageImage, 2005). +-define(wxTreebook_SetPageText, 2006). +-define(wxTreebook_SetSelection, 2007). +-define(wxTreebook_ChangeSelection, 2008). +-define(wxTreebook_destroy, 2009). +-define(wxTreeCtrl_new_2, 2012). +-define(wxTreeCtrl_new_0, 2013). +-define(wxTreeCtrl_destruct, 2015). +-define(wxTreeCtrl_AddRoot, 2016). +-define(wxTreeCtrl_AppendItem, 2017). +-define(wxTreeCtrl_AssignImageList, 2018). +-define(wxTreeCtrl_AssignStateImageList, 2019). +-define(wxTreeCtrl_Collapse, 2020). +-define(wxTreeCtrl_CollapseAndReset, 2021). +-define(wxTreeCtrl_Create, 2022). +-define(wxTreeCtrl_Delete, 2023). +-define(wxTreeCtrl_DeleteAllItems, 2024). +-define(wxTreeCtrl_DeleteChildren, 2025). +-define(wxTreeCtrl_EditLabel, 2026). +-define(wxTreeCtrl_EnsureVisible, 2027). +-define(wxTreeCtrl_Expand, 2028). +-define(wxTreeCtrl_GetBoundingRect, 2029). +-define(wxTreeCtrl_GetChildrenCount, 2031). +-define(wxTreeCtrl_GetCount, 2032). +-define(wxTreeCtrl_GetEditControl, 2033). +-define(wxTreeCtrl_GetFirstChild, 2034). +-define(wxTreeCtrl_GetNextChild, 2035). +-define(wxTreeCtrl_GetFirstVisibleItem, 2036). +-define(wxTreeCtrl_GetImageList, 2037). +-define(wxTreeCtrl_GetIndent, 2038). +-define(wxTreeCtrl_GetItemBackgroundColour, 2039). +-define(wxTreeCtrl_GetItemData, 2040). +-define(wxTreeCtrl_GetItemFont, 2041). +-define(wxTreeCtrl_GetItemImage_1, 2042). +-define(wxTreeCtrl_GetItemImage_2, 2043). +-define(wxTreeCtrl_GetItemText, 2044). +-define(wxTreeCtrl_GetItemTextColour, 2045). +-define(wxTreeCtrl_GetLastChild, 2046). +-define(wxTreeCtrl_GetNextSibling, 2047). +-define(wxTreeCtrl_GetNextVisible, 2048). +-define(wxTreeCtrl_GetItemParent, 2049). +-define(wxTreeCtrl_GetPrevSibling, 2050). +-define(wxTreeCtrl_GetPrevVisible, 2051). +-define(wxTreeCtrl_GetRootItem, 2052). +-define(wxTreeCtrl_GetSelection, 2053). +-define(wxTreeCtrl_GetSelections, 2054). +-define(wxTreeCtrl_GetStateImageList, 2055). +-define(wxTreeCtrl_HitTest, 2056). +-define(wxTreeCtrl_InsertItem, 2058). +-define(wxTreeCtrl_IsBold, 2059). +-define(wxTreeCtrl_IsExpanded, 2060). +-define(wxTreeCtrl_IsSelected, 2061). +-define(wxTreeCtrl_IsVisible, 2062). +-define(wxTreeCtrl_ItemHasChildren, 2063). +-define(wxTreeCtrl_IsTreeItemIdOk, 2064). +-define(wxTreeCtrl_PrependItem, 2065). +-define(wxTreeCtrl_ScrollTo, 2066). +-define(wxTreeCtrl_SelectItem_1, 2067). +-define(wxTreeCtrl_SelectItem_2, 2068). +-define(wxTreeCtrl_SetIndent, 2069). +-define(wxTreeCtrl_SetImageList, 2070). +-define(wxTreeCtrl_SetItemBackgroundColour, 2071). +-define(wxTreeCtrl_SetItemBold, 2072). +-define(wxTreeCtrl_SetItemData, 2073). +-define(wxTreeCtrl_SetItemDropHighlight, 2074). +-define(wxTreeCtrl_SetItemFont, 2075). +-define(wxTreeCtrl_SetItemHasChildren, 2076). +-define(wxTreeCtrl_SetItemImage_2, 2077). +-define(wxTreeCtrl_SetItemImage_3, 2078). +-define(wxTreeCtrl_SetItemText, 2079). +-define(wxTreeCtrl_SetItemTextColour, 2080). +-define(wxTreeCtrl_SetStateImageList, 2081). +-define(wxTreeCtrl_SetWindowStyle, 2082). +-define(wxTreeCtrl_SortChildren, 2083). +-define(wxTreeCtrl_Toggle, 2084). +-define(wxTreeCtrl_ToggleItemSelection, 2085). +-define(wxTreeCtrl_Unselect, 2086). +-define(wxTreeCtrl_UnselectAll, 2087). +-define(wxTreeCtrl_UnselectItem, 2088). +-define(wxScrollBar_new_0, 2089). +-define(wxScrollBar_new_3, 2090). +-define(wxScrollBar_destruct, 2091). +-define(wxScrollBar_Create, 2092). +-define(wxScrollBar_GetRange, 2093). +-define(wxScrollBar_GetPageSize, 2094). +-define(wxScrollBar_GetThumbPosition, 2095). +-define(wxScrollBar_GetThumbSize, 2096). +-define(wxScrollBar_SetThumbPosition, 2097). +-define(wxScrollBar_SetScrollbar, 2098). +-define(wxSpinButton_new_2, 2100). +-define(wxSpinButton_new_0, 2101). +-define(wxSpinButton_Create, 2102). +-define(wxSpinButton_GetMax, 2103). +-define(wxSpinButton_GetMin, 2104). +-define(wxSpinButton_GetValue, 2105). +-define(wxSpinButton_SetRange, 2106). +-define(wxSpinButton_SetValue, 2107). +-define(wxSpinButton_destroy, 2108). +-define(wxSpinCtrl_new_0, 2109). +-define(wxSpinCtrl_new_2, 2110). +-define(wxSpinCtrl_Create, 2112). +-define(wxSpinCtrl_SetValue_1_1, 2115). +-define(wxSpinCtrl_SetValue_1_0, 2116). +-define(wxSpinCtrl_GetValue, 2118). +-define(wxSpinCtrl_SetRange, 2120). +-define(wxSpinCtrl_SetSelection, 2121). +-define(wxSpinCtrl_GetMin, 2123). +-define(wxSpinCtrl_GetMax, 2125). +-define(wxSpinCtrl_destroy, 2126). +-define(wxStaticText_new_0, 2127). +-define(wxStaticText_new_4, 2128). +-define(wxStaticText_Create, 2129). +-define(wxStaticText_GetLabel, 2130). +-define(wxStaticText_SetLabel, 2131). +-define(wxStaticText_Wrap, 2132). +-define(wxStaticText_destroy, 2133). +-define(wxStaticBitmap_new_0, 2134). +-define(wxStaticBitmap_new_4, 2135). +-define(wxStaticBitmap_Create, 2136). +-define(wxStaticBitmap_GetBitmap, 2137). +-define(wxStaticBitmap_SetBitmap, 2138). +-define(wxStaticBitmap_destroy, 2139). +-define(wxRadioBox_new, 2140). +-define(wxRadioBox_destruct, 2142). +-define(wxRadioBox_Create, 2143). +-define(wxRadioBox_Enable_2, 2144). +-define(wxRadioBox_Enable_1, 2145). +-define(wxRadioBox_GetSelection, 2146). +-define(wxRadioBox_GetString, 2147). +-define(wxRadioBox_SetSelection, 2148). +-define(wxRadioBox_Show_2, 2149). +-define(wxRadioBox_Show_1, 2150). +-define(wxRadioBox_GetColumnCount, 2151). +-define(wxRadioBox_GetItemHelpText, 2152). +-define(wxRadioBox_GetItemToolTip, 2153). +-define(wxRadioBox_GetItemFromPoint, 2155). +-define(wxRadioBox_GetRowCount, 2156). +-define(wxRadioBox_IsItemEnabled, 2157). +-define(wxRadioBox_IsItemShown, 2158). +-define(wxRadioBox_SetItemHelpText, 2159). +-define(wxRadioBox_SetItemToolTip, 2160). +-define(wxRadioButton_new_0, 2161). +-define(wxRadioButton_new_4, 2162). +-define(wxRadioButton_Create, 2163). +-define(wxRadioButton_GetValue, 2164). +-define(wxRadioButton_SetValue, 2165). +-define(wxRadioButton_destroy, 2166). +-define(wxSlider_new_6, 2168). +-define(wxSlider_new_0, 2169). +-define(wxSlider_Create, 2170). +-define(wxSlider_GetLineSize, 2171). +-define(wxSlider_GetMax, 2172). +-define(wxSlider_GetMin, 2173). +-define(wxSlider_GetPageSize, 2174). +-define(wxSlider_GetThumbLength, 2175). +-define(wxSlider_GetValue, 2176). +-define(wxSlider_SetLineSize, 2177). +-define(wxSlider_SetPageSize, 2178). +-define(wxSlider_SetRange, 2179). +-define(wxSlider_SetThumbLength, 2180). +-define(wxSlider_SetValue, 2181). +-define(wxSlider_destroy, 2182). +-define(wxDialog_new_4, 2184). +-define(wxDialog_new_0, 2185). +-define(wxDialog_destruct, 2187). +-define(wxDialog_Create, 2188). +-define(wxDialog_CreateButtonSizer, 2189). +-define(wxDialog_CreateStdDialogButtonSizer, 2190). +-define(wxDialog_EndModal, 2191). +-define(wxDialog_GetAffirmativeId, 2192). +-define(wxDialog_GetReturnCode, 2193). +-define(wxDialog_IsModal, 2194). +-define(wxDialog_SetAffirmativeId, 2195). +-define(wxDialog_SetReturnCode, 2196). +-define(wxDialog_Show, 2197). +-define(wxDialog_ShowModal, 2198). +-define(wxColourDialog_new_0, 2199). +-define(wxColourDialog_new_2, 2200). +-define(wxColourDialog_destruct, 2201). +-define(wxColourDialog_Create, 2202). +-define(wxColourDialog_GetColourData, 2203). +-define(wxColourData_new_0, 2204). +-define(wxColourData_new_1, 2205). +-define(wxColourData_destruct, 2206). +-define(wxColourData_GetChooseFull, 2207). +-define(wxColourData_GetColour, 2208). +-define(wxColourData_GetCustomColour, 2210). +-define(wxColourData_SetChooseFull, 2211). +-define(wxColourData_SetColour, 2212). +-define(wxColourData_SetCustomColour, 2213). +-define(wxPalette_new_0, 2214). +-define(wxPalette_new_4, 2215). +-define(wxPalette_destruct, 2217). +-define(wxPalette_Create, 2218). +-define(wxPalette_GetColoursCount, 2219). +-define(wxPalette_GetPixel, 2220). +-define(wxPalette_GetRGB, 2221). +-define(wxPalette_IsOk, 2222). +-define(wxDirDialog_new, 2226). +-define(wxDirDialog_destruct, 2227). +-define(wxDirDialog_GetPath, 2228). +-define(wxDirDialog_GetMessage, 2229). +-define(wxDirDialog_SetMessage, 2230). +-define(wxDirDialog_SetPath, 2231). +-define(wxFileDialog_new, 2235). +-define(wxFileDialog_destruct, 2236). +-define(wxFileDialog_GetDirectory, 2237). +-define(wxFileDialog_GetFilename, 2238). +-define(wxFileDialog_GetFilenames, 2239). +-define(wxFileDialog_GetFilterIndex, 2240). +-define(wxFileDialog_GetMessage, 2241). +-define(wxFileDialog_GetPath, 2242). +-define(wxFileDialog_GetPaths, 2243). +-define(wxFileDialog_GetWildcard, 2244). +-define(wxFileDialog_SetDirectory, 2245). +-define(wxFileDialog_SetFilename, 2246). +-define(wxFileDialog_SetFilterIndex, 2247). +-define(wxFileDialog_SetMessage, 2248). +-define(wxFileDialog_SetPath, 2249). +-define(wxFileDialog_SetWildcard, 2250). +-define(wxPickerBase_SetInternalMargin, 2251). +-define(wxPickerBase_GetInternalMargin, 2252). +-define(wxPickerBase_SetTextCtrlProportion, 2253). +-define(wxPickerBase_SetPickerCtrlProportion, 2254). +-define(wxPickerBase_GetTextCtrlProportion, 2255). +-define(wxPickerBase_GetPickerCtrlProportion, 2256). +-define(wxPickerBase_HasTextCtrl, 2257). +-define(wxPickerBase_GetTextCtrl, 2258). +-define(wxPickerBase_IsTextCtrlGrowable, 2259). +-define(wxPickerBase_SetPickerCtrlGrowable, 2260). +-define(wxPickerBase_SetTextCtrlGrowable, 2261). +-define(wxPickerBase_IsPickerCtrlGrowable, 2262). +-define(wxFilePickerCtrl_new_0, 2263). +-define(wxFilePickerCtrl_new_3, 2264). +-define(wxFilePickerCtrl_Create, 2265). +-define(wxFilePickerCtrl_GetPath, 2266). +-define(wxFilePickerCtrl_SetPath, 2267). +-define(wxFilePickerCtrl_destroy, 2268). +-define(wxDirPickerCtrl_new_0, 2269). +-define(wxDirPickerCtrl_new_3, 2270). +-define(wxDirPickerCtrl_Create, 2271). +-define(wxDirPickerCtrl_GetPath, 2272). +-define(wxDirPickerCtrl_SetPath, 2273). +-define(wxDirPickerCtrl_destroy, 2274). +-define(wxColourPickerCtrl_new_0, 2275). +-define(wxColourPickerCtrl_new_3, 2276). +-define(wxColourPickerCtrl_Create, 2277). +-define(wxColourPickerCtrl_GetColour, 2278). +-define(wxColourPickerCtrl_SetColour_1_1, 2279). +-define(wxColourPickerCtrl_SetColour_1_0, 2280). +-define(wxColourPickerCtrl_destroy, 2281). +-define(wxDatePickerCtrl_new_0, 2282). +-define(wxDatePickerCtrl_new_3, 2283). +-define(wxDatePickerCtrl_GetRange, 2284). +-define(wxDatePickerCtrl_GetValue, 2285). +-define(wxDatePickerCtrl_SetRange, 2286). +-define(wxDatePickerCtrl_SetValue, 2287). +-define(wxDatePickerCtrl_destroy, 2288). +-define(wxFontPickerCtrl_new_0, 2289). +-define(wxFontPickerCtrl_new_3, 2290). +-define(wxFontPickerCtrl_Create, 2291). +-define(wxFontPickerCtrl_GetSelectedFont, 2292). +-define(wxFontPickerCtrl_SetSelectedFont, 2293). +-define(wxFontPickerCtrl_GetMaxPointSize, 2294). +-define(wxFontPickerCtrl_SetMaxPointSize, 2295). +-define(wxFontPickerCtrl_destroy, 2296). +-define(wxFindReplaceDialog_new_0, 2299). +-define(wxFindReplaceDialog_new_4, 2300). +-define(wxFindReplaceDialog_destruct, 2301). +-define(wxFindReplaceDialog_Create, 2302). +-define(wxFindReplaceDialog_GetData, 2303). +-define(wxFindReplaceData_new_0, 2304). +-define(wxFindReplaceData_new_1, 2305). +-define(wxFindReplaceData_GetFindString, 2306). +-define(wxFindReplaceData_GetReplaceString, 2307). +-define(wxFindReplaceData_GetFlags, 2308). +-define(wxFindReplaceData_SetFlags, 2309). +-define(wxFindReplaceData_SetFindString, 2310). +-define(wxFindReplaceData_SetReplaceString, 2311). +-define(wxFindReplaceData_destroy, 2312). +-define(wxMultiChoiceDialog_new_0, 2313). +-define(wxMultiChoiceDialog_new_5, 2315). +-define(wxMultiChoiceDialog_GetSelections, 2316). +-define(wxMultiChoiceDialog_SetSelections, 2317). +-define(wxMultiChoiceDialog_destroy, 2318). +-define(wxSingleChoiceDialog_new_0, 2319). +-define(wxSingleChoiceDialog_new_5, 2321). +-define(wxSingleChoiceDialog_GetSelection, 2322). +-define(wxSingleChoiceDialog_GetStringSelection, 2323). +-define(wxSingleChoiceDialog_SetSelection, 2324). +-define(wxSingleChoiceDialog_destroy, 2325). +-define(wxTextEntryDialog_new, 2326). +-define(wxTextEntryDialog_GetValue, 2327). +-define(wxTextEntryDialog_SetValue, 2328). +-define(wxTextEntryDialog_destroy, 2329). +-define(wxPasswordEntryDialog_new, 2330). +-define(wxPasswordEntryDialog_destroy, 2331). +-define(wxFontData_new_0, 2332). +-define(wxFontData_new_1, 2333). +-define(wxFontData_destruct, 2334). +-define(wxFontData_EnableEffects, 2335). +-define(wxFontData_GetAllowSymbols, 2336). +-define(wxFontData_GetColour, 2337). +-define(wxFontData_GetChosenFont, 2338). +-define(wxFontData_GetEnableEffects, 2339). +-define(wxFontData_GetInitialFont, 2340). +-define(wxFontData_GetShowHelp, 2341). +-define(wxFontData_SetAllowSymbols, 2342). +-define(wxFontData_SetChosenFont, 2343). +-define(wxFontData_SetColour, 2344). +-define(wxFontData_SetInitialFont, 2345). +-define(wxFontData_SetRange, 2346). +-define(wxFontData_SetShowHelp, 2347). +-define(wxFontDialog_new_0, 2351). +-define(wxFontDialog_new_2, 2353). +-define(wxFontDialog_Create, 2355). +-define(wxFontDialog_GetFontData, 2356). +-define(wxFontDialog_destroy, 2358). +-define(wxProgressDialog_new, 2359). +-define(wxProgressDialog_destruct, 2360). +-define(wxProgressDialog_Resume, 2361). +-define(wxProgressDialog_Update_2, 2362). +-define(wxProgressDialog_Update_0, 2363). +-define(wxMessageDialog_new, 2364). +-define(wxMessageDialog_destruct, 2365). +-define(wxPageSetupDialog_new, 2366). +-define(wxPageSetupDialog_destruct, 2367). +-define(wxPageSetupDialog_GetPageSetupData, 2368). +-define(wxPageSetupDialog_ShowModal, 2369). +-define(wxPageSetupDialogData_new_0, 2370). +-define(wxPageSetupDialogData_new_1_0, 2371). +-define(wxPageSetupDialogData_new_1_1, 2372). +-define(wxPageSetupDialogData_destruct, 2373). +-define(wxPageSetupDialogData_EnableHelp, 2374). +-define(wxPageSetupDialogData_EnableMargins, 2375). +-define(wxPageSetupDialogData_EnableOrientation, 2376). +-define(wxPageSetupDialogData_EnablePaper, 2377). +-define(wxPageSetupDialogData_EnablePrinter, 2378). +-define(wxPageSetupDialogData_GetDefaultMinMargins, 2379). +-define(wxPageSetupDialogData_GetEnableMargins, 2380). +-define(wxPageSetupDialogData_GetEnableOrientation, 2381). +-define(wxPageSetupDialogData_GetEnablePaper, 2382). +-define(wxPageSetupDialogData_GetEnablePrinter, 2383). +-define(wxPageSetupDialogData_GetEnableHelp, 2384). +-define(wxPageSetupDialogData_GetDefaultInfo, 2385). +-define(wxPageSetupDialogData_GetMarginTopLeft, 2386). +-define(wxPageSetupDialogData_GetMarginBottomRight, 2387). +-define(wxPageSetupDialogData_GetMinMarginTopLeft, 2388). +-define(wxPageSetupDialogData_GetMinMarginBottomRight, 2389). +-define(wxPageSetupDialogData_GetPaperId, 2390). +-define(wxPageSetupDialogData_GetPaperSize, 2391). +-define(wxPageSetupDialogData_GetPrintData, 2393). +-define(wxPageSetupDialogData_IsOk, 2394). +-define(wxPageSetupDialogData_SetDefaultInfo, 2395). +-define(wxPageSetupDialogData_SetDefaultMinMargins, 2396). +-define(wxPageSetupDialogData_SetMarginTopLeft, 2397). +-define(wxPageSetupDialogData_SetMarginBottomRight, 2398). +-define(wxPageSetupDialogData_SetMinMarginTopLeft, 2399). +-define(wxPageSetupDialogData_SetMinMarginBottomRight, 2400). +-define(wxPageSetupDialogData_SetPaperId, 2401). +-define(wxPageSetupDialogData_SetPaperSize_1_1, 2402). +-define(wxPageSetupDialogData_SetPaperSize_1_0, 2403). +-define(wxPageSetupDialogData_SetPrintData, 2404). +-define(wxPrintDialog_new_2_0, 2405). +-define(wxPrintDialog_new_2_1, 2406). +-define(wxPrintDialog_destruct, 2407). +-define(wxPrintDialog_GetPrintDialogData, 2408). +-define(wxPrintDialog_GetPrintDC, 2409). +-define(wxPrintDialogData_new_0, 2410). +-define(wxPrintDialogData_new_1_1, 2411). +-define(wxPrintDialogData_new_1_0, 2412). +-define(wxPrintDialogData_destruct, 2413). +-define(wxPrintDialogData_EnableHelp, 2414). +-define(wxPrintDialogData_EnablePageNumbers, 2415). +-define(wxPrintDialogData_EnablePrintToFile, 2416). +-define(wxPrintDialogData_EnableSelection, 2417). +-define(wxPrintDialogData_GetAllPages, 2418). +-define(wxPrintDialogData_GetCollate, 2419). +-define(wxPrintDialogData_GetFromPage, 2420). +-define(wxPrintDialogData_GetMaxPage, 2421). +-define(wxPrintDialogData_GetMinPage, 2422). +-define(wxPrintDialogData_GetNoCopies, 2423). +-define(wxPrintDialogData_GetPrintData, 2424). +-define(wxPrintDialogData_GetPrintToFile, 2425). +-define(wxPrintDialogData_GetSelection, 2426). +-define(wxPrintDialogData_GetToPage, 2427). +-define(wxPrintDialogData_IsOk, 2428). +-define(wxPrintDialogData_SetCollate, 2429). +-define(wxPrintDialogData_SetFromPage, 2430). +-define(wxPrintDialogData_SetMaxPage, 2431). +-define(wxPrintDialogData_SetMinPage, 2432). +-define(wxPrintDialogData_SetNoCopies, 2433). +-define(wxPrintDialogData_SetPrintData, 2434). +-define(wxPrintDialogData_SetPrintToFile, 2435). +-define(wxPrintDialogData_SetSelection, 2436). +-define(wxPrintDialogData_SetToPage, 2437). +-define(wxPrintData_new_0, 2438). +-define(wxPrintData_new_1, 2439). +-define(wxPrintData_destruct, 2440). +-define(wxPrintData_GetCollate, 2441). +-define(wxPrintData_GetBin, 2442). +-define(wxPrintData_GetColour, 2443). +-define(wxPrintData_GetDuplex, 2444). +-define(wxPrintData_GetNoCopies, 2445). +-define(wxPrintData_GetOrientation, 2446). +-define(wxPrintData_GetPaperId, 2447). +-define(wxPrintData_GetPrinterName, 2448). +-define(wxPrintData_GetQuality, 2449). +-define(wxPrintData_IsOk, 2450). +-define(wxPrintData_SetBin, 2451). +-define(wxPrintData_SetCollate, 2452). +-define(wxPrintData_SetColour, 2453). +-define(wxPrintData_SetDuplex, 2454). +-define(wxPrintData_SetNoCopies, 2455). +-define(wxPrintData_SetOrientation, 2456). +-define(wxPrintData_SetPaperId, 2457). +-define(wxPrintData_SetPrinterName, 2458). +-define(wxPrintData_SetQuality, 2459). +-define(wxPrintPreview_new_2, 2462). +-define(wxPrintPreview_new_3, 2463). +-define(wxPrintPreview_destruct, 2465). +-define(wxPrintPreview_GetCanvas, 2466). +-define(wxPrintPreview_GetCurrentPage, 2467). +-define(wxPrintPreview_GetFrame, 2468). +-define(wxPrintPreview_GetMaxPage, 2469). +-define(wxPrintPreview_GetMinPage, 2470). +-define(wxPrintPreview_GetPrintout, 2471). +-define(wxPrintPreview_GetPrintoutForPrinting, 2472). +-define(wxPrintPreview_IsOk, 2473). +-define(wxPrintPreview_PaintPage, 2474). +-define(wxPrintPreview_Print, 2475). +-define(wxPrintPreview_RenderPage, 2476). +-define(wxPrintPreview_SetCanvas, 2477). +-define(wxPrintPreview_SetCurrentPage, 2478). +-define(wxPrintPreview_SetFrame, 2479). +-define(wxPrintPreview_SetPrintout, 2480). +-define(wxPrintPreview_SetZoom, 2481). +-define(wxPreviewFrame_new, 2482). +-define(wxPreviewFrame_destruct, 2483). +-define(wxPreviewFrame_CreateControlBar, 2484). +-define(wxPreviewFrame_CreateCanvas, 2485). +-define(wxPreviewFrame_Initialize, 2486). +-define(wxPreviewFrame_OnCloseWindow, 2487). +-define(wxPreviewControlBar_new, 2488). +-define(wxPreviewControlBar_destruct, 2489). +-define(wxPreviewControlBar_CreateButtons, 2490). +-define(wxPreviewControlBar_GetPrintPreview, 2491). +-define(wxPreviewControlBar_GetZoomControl, 2492). +-define(wxPreviewControlBar_SetZoomControl, 2493). +-define(wxPrinter_new, 2495). +-define(wxPrinter_CreateAbortWindow, 2496). +-define(wxPrinter_GetAbort, 2497). +-define(wxPrinter_GetLastError, 2498). +-define(wxPrinter_GetPrintDialogData, 2499). +-define(wxPrinter_Print, 2500). +-define(wxPrinter_PrintDialog, 2501). +-define(wxPrinter_ReportError, 2502). +-define(wxPrinter_Setup, 2503). +-define(wxPrinter_destroy, 2504). +-define(wxXmlResource_new_1, 2505). +-define(wxXmlResource_new_2, 2506). +-define(wxXmlResource_destruct, 2507). +-define(wxXmlResource_AttachUnknownControl, 2508). +-define(wxXmlResource_ClearHandlers, 2509). +-define(wxXmlResource_CompareVersion, 2510). +-define(wxXmlResource_Get, 2511). +-define(wxXmlResource_GetFlags, 2512). +-define(wxXmlResource_GetVersion, 2513). +-define(wxXmlResource_GetXRCID, 2514). +-define(wxXmlResource_InitAllHandlers, 2515). +-define(wxXmlResource_Load, 2516). +-define(wxXmlResource_LoadBitmap, 2517). +-define(wxXmlResource_LoadDialog_2, 2518). +-define(wxXmlResource_LoadDialog_3, 2519). +-define(wxXmlResource_LoadFrame_2, 2520). +-define(wxXmlResource_LoadFrame_3, 2521). +-define(wxXmlResource_LoadIcon, 2522). +-define(wxXmlResource_LoadMenu, 2523). +-define(wxXmlResource_LoadMenuBar_2, 2524). +-define(wxXmlResource_LoadMenuBar_1, 2525). +-define(wxXmlResource_LoadPanel_2, 2526). +-define(wxXmlResource_LoadPanel_3, 2527). +-define(wxXmlResource_LoadToolBar, 2528). +-define(wxXmlResource_Set, 2529). +-define(wxXmlResource_SetFlags, 2530). +-define(wxXmlResource_Unload, 2531). +-define(wxXmlResource_xrcctrl, 2532). +-define(wxHtmlEasyPrinting_new, 2533). +-define(wxHtmlEasyPrinting_destruct, 2534). +-define(wxHtmlEasyPrinting_GetPrintData, 2535). +-define(wxHtmlEasyPrinting_GetPageSetupData, 2536). +-define(wxHtmlEasyPrinting_PreviewFile, 2537). +-define(wxHtmlEasyPrinting_PreviewText, 2538). +-define(wxHtmlEasyPrinting_PrintFile, 2539). +-define(wxHtmlEasyPrinting_PrintText, 2540). +-define(wxHtmlEasyPrinting_PageSetup, 2541). +-define(wxHtmlEasyPrinting_SetFonts, 2542). +-define(wxHtmlEasyPrinting_SetHeader, 2543). +-define(wxHtmlEasyPrinting_SetFooter, 2544). +-define(wxGLCanvas_new_2, 2546). +-define(wxGLCanvas_new_3_1, 2547). +-define(wxGLCanvas_new_3_0, 2548). +-define(wxGLCanvas_GetContext, 2549). +-define(wxGLCanvas_SetCurrent, 2551). +-define(wxGLCanvas_SwapBuffers, 2552). +-define(wxGLCanvas_destroy, 2553). +-define(wxAuiManager_new, 2554). +-define(wxAuiManager_destruct, 2555). +-define(wxAuiManager_AddPane_2_1, 2556). +-define(wxAuiManager_AddPane_3, 2557). +-define(wxAuiManager_AddPane_2_0, 2558). +-define(wxAuiManager_DetachPane, 2559). +-define(wxAuiManager_GetAllPanes, 2560). +-define(wxAuiManager_GetArtProvider, 2561). +-define(wxAuiManager_GetDockSizeConstraint, 2562). +-define(wxAuiManager_GetFlags, 2563). +-define(wxAuiManager_GetManagedWindow, 2564). +-define(wxAuiManager_GetManager, 2565). +-define(wxAuiManager_GetPane_1_1, 2566). +-define(wxAuiManager_GetPane_1_0, 2567). +-define(wxAuiManager_HideHint, 2568). +-define(wxAuiManager_InsertPane, 2569). +-define(wxAuiManager_LoadPaneInfo, 2570). +-define(wxAuiManager_LoadPerspective, 2571). +-define(wxAuiManager_SavePaneInfo, 2572). +-define(wxAuiManager_SavePerspective, 2573). +-define(wxAuiManager_SetArtProvider, 2574). +-define(wxAuiManager_SetDockSizeConstraint, 2575). +-define(wxAuiManager_SetFlags, 2576). +-define(wxAuiManager_SetManagedWindow, 2577). +-define(wxAuiManager_ShowHint, 2578). +-define(wxAuiManager_UnInit, 2579). +-define(wxAuiManager_Update, 2580). +-define(wxAuiPaneInfo_new_0, 2581). +-define(wxAuiPaneInfo_new_1, 2582). +-define(wxAuiPaneInfo_destruct, 2583). +-define(wxAuiPaneInfo_BestSize_1, 2584). +-define(wxAuiPaneInfo_BestSize_2, 2585). +-define(wxAuiPaneInfo_Bottom, 2586). +-define(wxAuiPaneInfo_BottomDockable, 2587). +-define(wxAuiPaneInfo_Caption, 2588). +-define(wxAuiPaneInfo_CaptionVisible, 2589). +-define(wxAuiPaneInfo_Centre, 2590). +-define(wxAuiPaneInfo_CentrePane, 2591). +-define(wxAuiPaneInfo_CloseButton, 2592). +-define(wxAuiPaneInfo_DefaultPane, 2593). +-define(wxAuiPaneInfo_DestroyOnClose, 2594). +-define(wxAuiPaneInfo_Direction, 2595). +-define(wxAuiPaneInfo_Dock, 2596). +-define(wxAuiPaneInfo_Dockable, 2597). +-define(wxAuiPaneInfo_Fixed, 2598). +-define(wxAuiPaneInfo_Float, 2599). +-define(wxAuiPaneInfo_Floatable, 2600). +-define(wxAuiPaneInfo_FloatingPosition_1, 2601). +-define(wxAuiPaneInfo_FloatingPosition_2, 2602). +-define(wxAuiPaneInfo_FloatingSize_1, 2603). +-define(wxAuiPaneInfo_FloatingSize_2, 2604). +-define(wxAuiPaneInfo_Gripper, 2605). +-define(wxAuiPaneInfo_GripperTop, 2606). +-define(wxAuiPaneInfo_HasBorder, 2607). +-define(wxAuiPaneInfo_HasCaption, 2608). +-define(wxAuiPaneInfo_HasCloseButton, 2609). +-define(wxAuiPaneInfo_HasFlag, 2610). +-define(wxAuiPaneInfo_HasGripper, 2611). +-define(wxAuiPaneInfo_HasGripperTop, 2612). +-define(wxAuiPaneInfo_HasMaximizeButton, 2613). +-define(wxAuiPaneInfo_HasMinimizeButton, 2614). +-define(wxAuiPaneInfo_HasPinButton, 2615). +-define(wxAuiPaneInfo_Hide, 2616). +-define(wxAuiPaneInfo_IsBottomDockable, 2617). +-define(wxAuiPaneInfo_IsDocked, 2618). +-define(wxAuiPaneInfo_IsFixed, 2619). +-define(wxAuiPaneInfo_IsFloatable, 2620). +-define(wxAuiPaneInfo_IsFloating, 2621). +-define(wxAuiPaneInfo_IsLeftDockable, 2622). +-define(wxAuiPaneInfo_IsMovable, 2623). +-define(wxAuiPaneInfo_IsOk, 2624). +-define(wxAuiPaneInfo_IsResizable, 2625). +-define(wxAuiPaneInfo_IsRightDockable, 2626). +-define(wxAuiPaneInfo_IsShown, 2627). +-define(wxAuiPaneInfo_IsToolbar, 2628). +-define(wxAuiPaneInfo_IsTopDockable, 2629). +-define(wxAuiPaneInfo_Layer, 2630). +-define(wxAuiPaneInfo_Left, 2631). +-define(wxAuiPaneInfo_LeftDockable, 2632). +-define(wxAuiPaneInfo_MaxSize_1, 2633). +-define(wxAuiPaneInfo_MaxSize_2, 2634). +-define(wxAuiPaneInfo_MaximizeButton, 2635). +-define(wxAuiPaneInfo_MinSize_1, 2636). +-define(wxAuiPaneInfo_MinSize_2, 2637). +-define(wxAuiPaneInfo_MinimizeButton, 2638). +-define(wxAuiPaneInfo_Movable, 2639). +-define(wxAuiPaneInfo_Name, 2640). +-define(wxAuiPaneInfo_PaneBorder, 2641). +-define(wxAuiPaneInfo_PinButton, 2642). +-define(wxAuiPaneInfo_Position, 2643). +-define(wxAuiPaneInfo_Resizable, 2644). +-define(wxAuiPaneInfo_Right, 2645). +-define(wxAuiPaneInfo_RightDockable, 2646). +-define(wxAuiPaneInfo_Row, 2647). +-define(wxAuiPaneInfo_SafeSet, 2648). +-define(wxAuiPaneInfo_SetFlag, 2649). +-define(wxAuiPaneInfo_Show, 2650). +-define(wxAuiPaneInfo_ToolbarPane, 2651). +-define(wxAuiPaneInfo_Top, 2652). +-define(wxAuiPaneInfo_TopDockable, 2653). +-define(wxAuiPaneInfo_Window, 2654). +-define(wxAuiPaneInfo_GetWindow, 2655). +-define(wxAuiPaneInfo_GetFrame, 2656). +-define(wxAuiPaneInfo_GetDirection, 2657). +-define(wxAuiPaneInfo_GetLayer, 2658). +-define(wxAuiPaneInfo_GetRow, 2659). +-define(wxAuiPaneInfo_GetPosition, 2660). +-define(wxAuiPaneInfo_GetFloatingPosition, 2661). +-define(wxAuiPaneInfo_GetFloatingSize, 2662). +-define(wxAuiNotebook_new_0, 2663). +-define(wxAuiNotebook_new_2, 2664). +-define(wxAuiNotebook_AddPage, 2665). +-define(wxAuiNotebook_Create, 2666). +-define(wxAuiNotebook_DeletePage, 2667). +-define(wxAuiNotebook_GetArtProvider, 2668). +-define(wxAuiNotebook_GetPage, 2669). +-define(wxAuiNotebook_GetPageBitmap, 2670). +-define(wxAuiNotebook_GetPageCount, 2671). +-define(wxAuiNotebook_GetPageIndex, 2672). +-define(wxAuiNotebook_GetPageText, 2673). +-define(wxAuiNotebook_GetSelection, 2674). +-define(wxAuiNotebook_InsertPage, 2675). +-define(wxAuiNotebook_RemovePage, 2676). +-define(wxAuiNotebook_SetArtProvider, 2677). +-define(wxAuiNotebook_SetFont, 2678). +-define(wxAuiNotebook_SetPageBitmap, 2679). +-define(wxAuiNotebook_SetPageText, 2680). +-define(wxAuiNotebook_SetSelection, 2681). +-define(wxAuiNotebook_SetTabCtrlHeight, 2682). +-define(wxAuiNotebook_SetUniformBitmapSize, 2683). +-define(wxAuiNotebook_destroy, 2684). +-define(wxAuiTabArt_SetFlags, 2685). +-define(wxAuiTabArt_SetMeasuringFont, 2686). +-define(wxAuiTabArt_SetNormalFont, 2687). +-define(wxAuiTabArt_SetSelectedFont, 2688). +-define(wxAuiTabArt_SetColour, 2689). +-define(wxAuiTabArt_SetActiveColour, 2690). +-define(wxAuiDockArt_GetColour, 2691). +-define(wxAuiDockArt_GetFont, 2692). +-define(wxAuiDockArt_GetMetric, 2693). +-define(wxAuiDockArt_SetColour, 2694). +-define(wxAuiDockArt_SetFont, 2695). +-define(wxAuiDockArt_SetMetric, 2696). +-define(wxAuiSimpleTabArt_new, 2697). +-define(wxAuiSimpleTabArt_destroy, 2698). +-define(wxMDIParentFrame_new_0, 2699). +-define(wxMDIParentFrame_new_4, 2700). +-define(wxMDIParentFrame_destruct, 2701). +-define(wxMDIParentFrame_ActivateNext, 2702). +-define(wxMDIParentFrame_ActivatePrevious, 2703). +-define(wxMDIParentFrame_ArrangeIcons, 2704). +-define(wxMDIParentFrame_Cascade, 2705). +-define(wxMDIParentFrame_Create, 2706). +-define(wxMDIParentFrame_GetActiveChild, 2707). +-define(wxMDIParentFrame_GetClientWindow, 2708). +-define(wxMDIParentFrame_Tile, 2709). +-define(wxMDIChildFrame_new_0, 2710). +-define(wxMDIChildFrame_new_4, 2711). +-define(wxMDIChildFrame_destruct, 2712). +-define(wxMDIChildFrame_Activate, 2713). +-define(wxMDIChildFrame_Create, 2714). +-define(wxMDIChildFrame_Maximize, 2715). +-define(wxMDIChildFrame_Restore, 2716). +-define(wxMDIClientWindow_new_0, 2717). +-define(wxMDIClientWindow_new_2, 2718). +-define(wxMDIClientWindow_destruct, 2719). +-define(wxMDIClientWindow_CreateClient, 2720). +-define(wxLayoutAlgorithm_new, 2721). +-define(wxLayoutAlgorithm_LayoutFrame, 2722). +-define(wxLayoutAlgorithm_LayoutMDIFrame, 2723). +-define(wxLayoutAlgorithm_LayoutWindow, 2724). +-define(wxLayoutAlgorithm_destroy, 2725). +-define(wxEvent_GetId, 2726). +-define(wxEvent_GetSkipped, 2727). +-define(wxEvent_GetTimestamp, 2728). +-define(wxEvent_IsCommandEvent, 2729). +-define(wxEvent_ResumePropagation, 2730). +-define(wxEvent_ShouldPropagate, 2731). +-define(wxEvent_Skip, 2732). +-define(wxEvent_StopPropagation, 2733). +-define(wxCommandEvent_getClientData, 2734). +-define(wxCommandEvent_GetExtraLong, 2735). +-define(wxCommandEvent_GetInt, 2736). +-define(wxCommandEvent_GetSelection, 2737). +-define(wxCommandEvent_GetString, 2738). +-define(wxCommandEvent_IsChecked, 2739). +-define(wxCommandEvent_IsSelection, 2740). +-define(wxCommandEvent_SetInt, 2741). +-define(wxCommandEvent_SetString, 2742). +-define(wxScrollEvent_GetOrientation, 2743). +-define(wxScrollEvent_GetPosition, 2744). +-define(wxScrollWinEvent_GetOrientation, 2745). +-define(wxScrollWinEvent_GetPosition, 2746). +-define(wxMouseEvent_AltDown, 2747). +-define(wxMouseEvent_Button, 2748). +-define(wxMouseEvent_ButtonDClick, 2749). +-define(wxMouseEvent_ButtonDown, 2750). +-define(wxMouseEvent_ButtonUp, 2751). +-define(wxMouseEvent_CmdDown, 2752). +-define(wxMouseEvent_ControlDown, 2753). +-define(wxMouseEvent_Dragging, 2754). +-define(wxMouseEvent_Entering, 2755). +-define(wxMouseEvent_GetButton, 2756). +-define(wxMouseEvent_GetPosition, 2759). +-define(wxMouseEvent_GetLogicalPosition, 2760). +-define(wxMouseEvent_GetLinesPerAction, 2761). +-define(wxMouseEvent_GetWheelRotation, 2762). +-define(wxMouseEvent_GetWheelDelta, 2763). +-define(wxMouseEvent_GetX, 2764). +-define(wxMouseEvent_GetY, 2765). +-define(wxMouseEvent_IsButton, 2766). +-define(wxMouseEvent_IsPageScroll, 2767). +-define(wxMouseEvent_Leaving, 2768). +-define(wxMouseEvent_LeftDClick, 2769). +-define(wxMouseEvent_LeftDown, 2770). +-define(wxMouseEvent_LeftIsDown, 2771). +-define(wxMouseEvent_LeftUp, 2772). +-define(wxMouseEvent_MetaDown, 2773). +-define(wxMouseEvent_MiddleDClick, 2774). +-define(wxMouseEvent_MiddleDown, 2775). +-define(wxMouseEvent_MiddleIsDown, 2776). +-define(wxMouseEvent_MiddleUp, 2777). +-define(wxMouseEvent_Moving, 2778). +-define(wxMouseEvent_RightDClick, 2779). +-define(wxMouseEvent_RightDown, 2780). +-define(wxMouseEvent_RightIsDown, 2781). +-define(wxMouseEvent_RightUp, 2782). +-define(wxMouseEvent_ShiftDown, 2783). +-define(wxSetCursorEvent_GetCursor, 2784). +-define(wxSetCursorEvent_GetX, 2785). +-define(wxSetCursorEvent_GetY, 2786). +-define(wxSetCursorEvent_HasCursor, 2787). +-define(wxSetCursorEvent_SetCursor, 2788). +-define(wxKeyEvent_AltDown, 2789). +-define(wxKeyEvent_CmdDown, 2790). +-define(wxKeyEvent_ControlDown, 2791). +-define(wxKeyEvent_GetKeyCode, 2792). +-define(wxKeyEvent_GetModifiers, 2793). +-define(wxKeyEvent_GetPosition, 2796). +-define(wxKeyEvent_GetRawKeyCode, 2797). +-define(wxKeyEvent_GetRawKeyFlags, 2798). +-define(wxKeyEvent_GetUnicodeKey, 2799). +-define(wxKeyEvent_GetX, 2800). +-define(wxKeyEvent_GetY, 2801). +-define(wxKeyEvent_HasModifiers, 2802). +-define(wxKeyEvent_MetaDown, 2803). +-define(wxKeyEvent_ShiftDown, 2804). +-define(wxSizeEvent_GetSize, 2805). +-define(wxMoveEvent_GetPosition, 2806). +-define(wxEraseEvent_GetDC, 2807). +-define(wxFocusEvent_GetWindow, 2808). +-define(wxChildFocusEvent_GetWindow, 2809). +-define(wxMenuEvent_GetMenu, 2810). +-define(wxMenuEvent_GetMenuId, 2811). +-define(wxMenuEvent_IsPopup, 2812). +-define(wxCloseEvent_CanVeto, 2813). +-define(wxCloseEvent_GetLoggingOff, 2814). +-define(wxCloseEvent_SetCanVeto, 2815). +-define(wxCloseEvent_SetLoggingOff, 2816). +-define(wxCloseEvent_Veto, 2817). +-define(wxShowEvent_SetShow, 2818). +-define(wxShowEvent_GetShow, 2819). +-define(wxIconizeEvent_Iconized, 2820). +-define(wxJoystickEvent_ButtonDown, 2821). +-define(wxJoystickEvent_ButtonIsDown, 2822). +-define(wxJoystickEvent_ButtonUp, 2823). +-define(wxJoystickEvent_GetButtonChange, 2824). +-define(wxJoystickEvent_GetButtonState, 2825). +-define(wxJoystickEvent_GetJoystick, 2826). +-define(wxJoystickEvent_GetPosition, 2827). +-define(wxJoystickEvent_GetZPosition, 2828). +-define(wxJoystickEvent_IsButton, 2829). +-define(wxJoystickEvent_IsMove, 2830). +-define(wxJoystickEvent_IsZMove, 2831). +-define(wxUpdateUIEvent_CanUpdate, 2832). +-define(wxUpdateUIEvent_Check, 2833). +-define(wxUpdateUIEvent_Enable, 2834). +-define(wxUpdateUIEvent_Show, 2835). +-define(wxUpdateUIEvent_GetChecked, 2836). +-define(wxUpdateUIEvent_GetEnabled, 2837). +-define(wxUpdateUIEvent_GetShown, 2838). +-define(wxUpdateUIEvent_GetSetChecked, 2839). +-define(wxUpdateUIEvent_GetSetEnabled, 2840). +-define(wxUpdateUIEvent_GetSetShown, 2841). +-define(wxUpdateUIEvent_GetSetText, 2842). +-define(wxUpdateUIEvent_GetText, 2843). +-define(wxUpdateUIEvent_GetMode, 2844). +-define(wxUpdateUIEvent_GetUpdateInterval, 2845). +-define(wxUpdateUIEvent_ResetUpdateTime, 2846). +-define(wxUpdateUIEvent_SetMode, 2847). +-define(wxUpdateUIEvent_SetText, 2848). +-define(wxUpdateUIEvent_SetUpdateInterval, 2849). +-define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2850). +-define(wxPaletteChangedEvent_SetChangedWindow, 2851). +-define(wxPaletteChangedEvent_GetChangedWindow, 2852). +-define(wxQueryNewPaletteEvent_SetPaletteRealized, 2853). +-define(wxQueryNewPaletteEvent_GetPaletteRealized, 2854). +-define(wxNavigationKeyEvent_GetDirection, 2855). +-define(wxNavigationKeyEvent_SetDirection, 2856). +-define(wxNavigationKeyEvent_IsWindowChange, 2857). +-define(wxNavigationKeyEvent_SetWindowChange, 2858). +-define(wxNavigationKeyEvent_IsFromTab, 2859). +-define(wxNavigationKeyEvent_SetFromTab, 2860). +-define(wxNavigationKeyEvent_GetCurrentFocus, 2861). +-define(wxNavigationKeyEvent_SetCurrentFocus, 2862). +-define(wxHelpEvent_GetOrigin, 2863). +-define(wxHelpEvent_GetPosition, 2864). +-define(wxHelpEvent_SetOrigin, 2865). +-define(wxHelpEvent_SetPosition, 2866). +-define(wxContextMenuEvent_GetPosition, 2867). +-define(wxContextMenuEvent_SetPosition, 2868). +-define(wxIdleEvent_CanSend, 2869). +-define(wxIdleEvent_GetMode, 2870). +-define(wxIdleEvent_RequestMore, 2871). +-define(wxIdleEvent_MoreRequested, 2872). +-define(wxIdleEvent_SetMode, 2873). +-define(wxGridEvent_AltDown, 2874). +-define(wxGridEvent_ControlDown, 2875). +-define(wxGridEvent_GetCol, 2876). +-define(wxGridEvent_GetPosition, 2877). +-define(wxGridEvent_GetRow, 2878). +-define(wxGridEvent_MetaDown, 2879). +-define(wxGridEvent_Selecting, 2880). +-define(wxGridEvent_ShiftDown, 2881). +-define(wxNotifyEvent_Allow, 2882). +-define(wxNotifyEvent_IsAllowed, 2883). +-define(wxNotifyEvent_Veto, 2884). +-define(wxSashEvent_GetEdge, 2885). +-define(wxSashEvent_GetDragRect, 2886). +-define(wxSashEvent_GetDragStatus, 2887). +-define(wxListEvent_GetCacheFrom, 2888). +-define(wxListEvent_GetCacheTo, 2889). +-define(wxListEvent_GetKeyCode, 2890). +-define(wxListEvent_GetIndex, 2891). +-define(wxListEvent_GetColumn, 2892). +-define(wxListEvent_GetPoint, 2893). +-define(wxListEvent_GetLabel, 2894). +-define(wxListEvent_GetText, 2895). +-define(wxListEvent_GetImage, 2896). +-define(wxListEvent_GetData, 2897). +-define(wxListEvent_GetMask, 2898). +-define(wxListEvent_GetItem, 2899). +-define(wxListEvent_IsEditCancelled, 2900). +-define(wxDateEvent_GetDate, 2901). +-define(wxCalendarEvent_GetWeekDay, 2902). +-define(wxFileDirPickerEvent_GetPath, 2903). +-define(wxColourPickerEvent_GetColour, 2904). +-define(wxFontPickerEvent_GetFont, 2905). +-define(wxStyledTextEvent_GetPosition, 2906). +-define(wxStyledTextEvent_GetKey, 2907). +-define(wxStyledTextEvent_GetModifiers, 2908). +-define(wxStyledTextEvent_GetModificationType, 2909). +-define(wxStyledTextEvent_GetText, 2910). +-define(wxStyledTextEvent_GetLength, 2911). +-define(wxStyledTextEvent_GetLinesAdded, 2912). +-define(wxStyledTextEvent_GetLine, 2913). +-define(wxStyledTextEvent_GetFoldLevelNow, 2914). +-define(wxStyledTextEvent_GetFoldLevelPrev, 2915). +-define(wxStyledTextEvent_GetMargin, 2916). +-define(wxStyledTextEvent_GetMessage, 2917). +-define(wxStyledTextEvent_GetWParam, 2918). +-define(wxStyledTextEvent_GetLParam, 2919). +-define(wxStyledTextEvent_GetListType, 2920). +-define(wxStyledTextEvent_GetX, 2921). +-define(wxStyledTextEvent_GetY, 2922). +-define(wxStyledTextEvent_GetDragText, 2923). +-define(wxStyledTextEvent_GetDragAllowMove, 2924). +-define(wxStyledTextEvent_GetDragResult, 2925). +-define(wxStyledTextEvent_GetShift, 2926). +-define(wxStyledTextEvent_GetControl, 2927). +-define(wxStyledTextEvent_GetAlt, 2928). +-define(utils_wxGetKeyState, 2929). +-define(utils_wxGetMousePosition, 2930). +-define(utils_wxGetMouseState, 2931). +-define(utils_wxSetDetectableAutoRepeat, 2932). +-define(utils_wxBell, 2933). +-define(utils_wxFindMenuItemId, 2934). +-define(utils_wxGenericFindWindowAtPoint, 2935). +-define(utils_wxFindWindowAtPoint, 2936). +-define(utils_wxBeginBusyCursor, 2937). +-define(utils_wxEndBusyCursor, 2938). +-define(utils_wxIsBusy, 2939). +-define(utils_wxShutdown, 2940). +-define(utils_wxShell, 2941). +-define(utils_wxLaunchDefaultBrowser, 2942). +-define(utils_wxGetEmailAddress, 2943). +-define(utils_wxGetUserId, 2944). +-define(utils_wxGetHomeDir, 2945). +-define(utils_wxNewId, 2946). +-define(utils_wxRegisterId, 2947). +-define(utils_wxGetCurrentId, 2948). +-define(utils_wxGetOsDescription, 2949). +-define(utils_wxIsPlatformLittleEndian, 2950). +-define(utils_wxIsPlatform64Bit, 2951). +-define(gdicmn_wxDisplaySize, 2952). +-define(gdicmn_wxSetCursor, 2953). +-define(wxPrintout_new, 2954). +-define(wxPrintout_destruct, 2955). +-define(wxPrintout_GetDC, 2956). +-define(wxPrintout_GetPageSizeMM, 2957). +-define(wxPrintout_GetPageSizePixels, 2958). +-define(wxPrintout_GetPaperRectPixels, 2959). +-define(wxPrintout_GetPPIPrinter, 2960). +-define(wxPrintout_GetPPIScreen, 2961). +-define(wxPrintout_GetTitle, 2962). +-define(wxPrintout_IsPreview, 2963). +-define(wxPrintout_FitThisSizeToPaper, 2964). +-define(wxPrintout_FitThisSizeToPage, 2965). +-define(wxPrintout_FitThisSizeToPageMargins, 2966). +-define(wxPrintout_MapScreenSizeToPaper, 2967). +-define(wxPrintout_MapScreenSizeToPage, 2968). +-define(wxPrintout_MapScreenSizeToPageMargins, 2969). +-define(wxPrintout_MapScreenSizeToDevice, 2970). +-define(wxPrintout_GetLogicalPaperRect, 2971). +-define(wxPrintout_GetLogicalPageRect, 2972). +-define(wxPrintout_GetLogicalPageMarginsRect, 2973). +-define(wxPrintout_SetLogicalOrigin, 2974). +-define(wxPrintout_OffsetLogicalOrigin, 2975). +-define(wxStyledTextCtrl_new_2, 2976). +-define(wxStyledTextCtrl_new_0, 2977). +-define(wxStyledTextCtrl_destruct, 2978). +-define(wxStyledTextCtrl_Create, 2979). +-define(wxStyledTextCtrl_AddText, 2980). +-define(wxStyledTextCtrl_AddStyledText, 2981). +-define(wxStyledTextCtrl_InsertText, 2982). +-define(wxStyledTextCtrl_ClearAll, 2983). +-define(wxStyledTextCtrl_ClearDocumentStyle, 2984). +-define(wxStyledTextCtrl_GetLength, 2985). +-define(wxStyledTextCtrl_GetCharAt, 2986). +-define(wxStyledTextCtrl_GetCurrentPos, 2987). +-define(wxStyledTextCtrl_GetAnchor, 2988). +-define(wxStyledTextCtrl_GetStyleAt, 2989). +-define(wxStyledTextCtrl_Redo, 2990). +-define(wxStyledTextCtrl_SetUndoCollection, 2991). +-define(wxStyledTextCtrl_SelectAll, 2992). +-define(wxStyledTextCtrl_SetSavePoint, 2993). +-define(wxStyledTextCtrl_GetStyledText, 2994). +-define(wxStyledTextCtrl_CanRedo, 2995). +-define(wxStyledTextCtrl_MarkerLineFromHandle, 2996). +-define(wxStyledTextCtrl_MarkerDeleteHandle, 2997). +-define(wxStyledTextCtrl_GetUndoCollection, 2998). +-define(wxStyledTextCtrl_GetViewWhiteSpace, 2999). +-define(wxStyledTextCtrl_SetViewWhiteSpace, 3000). +-define(wxStyledTextCtrl_PositionFromPoint, 3001). +-define(wxStyledTextCtrl_PositionFromPointClose, 3002). +-define(wxStyledTextCtrl_GotoLine, 3003). +-define(wxStyledTextCtrl_GotoPos, 3004). +-define(wxStyledTextCtrl_SetAnchor, 3005). +-define(wxStyledTextCtrl_GetCurLine, 3006). +-define(wxStyledTextCtrl_GetEndStyled, 3007). +-define(wxStyledTextCtrl_ConvertEOLs, 3008). +-define(wxStyledTextCtrl_GetEOLMode, 3009). +-define(wxStyledTextCtrl_SetEOLMode, 3010). +-define(wxStyledTextCtrl_StartStyling, 3011). +-define(wxStyledTextCtrl_SetStyling, 3012). +-define(wxStyledTextCtrl_GetBufferedDraw, 3013). +-define(wxStyledTextCtrl_SetBufferedDraw, 3014). +-define(wxStyledTextCtrl_SetTabWidth, 3015). +-define(wxStyledTextCtrl_GetTabWidth, 3016). +-define(wxStyledTextCtrl_SetCodePage, 3017). +-define(wxStyledTextCtrl_MarkerDefine, 3018). +-define(wxStyledTextCtrl_MarkerSetForeground, 3019). +-define(wxStyledTextCtrl_MarkerSetBackground, 3020). +-define(wxStyledTextCtrl_MarkerAdd, 3021). +-define(wxStyledTextCtrl_MarkerDelete, 3022). +-define(wxStyledTextCtrl_MarkerDeleteAll, 3023). +-define(wxStyledTextCtrl_MarkerGet, 3024). +-define(wxStyledTextCtrl_MarkerNext, 3025). +-define(wxStyledTextCtrl_MarkerPrevious, 3026). +-define(wxStyledTextCtrl_MarkerDefineBitmap, 3027). +-define(wxStyledTextCtrl_MarkerAddSet, 3028). +-define(wxStyledTextCtrl_MarkerSetAlpha, 3029). +-define(wxStyledTextCtrl_SetMarginType, 3030). +-define(wxStyledTextCtrl_GetMarginType, 3031). +-define(wxStyledTextCtrl_SetMarginWidth, 3032). +-define(wxStyledTextCtrl_GetMarginWidth, 3033). +-define(wxStyledTextCtrl_SetMarginMask, 3034). +-define(wxStyledTextCtrl_GetMarginMask, 3035). +-define(wxStyledTextCtrl_SetMarginSensitive, 3036). +-define(wxStyledTextCtrl_GetMarginSensitive, 3037). +-define(wxStyledTextCtrl_StyleClearAll, 3038). +-define(wxStyledTextCtrl_StyleSetForeground, 3039). +-define(wxStyledTextCtrl_StyleSetBackground, 3040). +-define(wxStyledTextCtrl_StyleSetBold, 3041). +-define(wxStyledTextCtrl_StyleSetItalic, 3042). +-define(wxStyledTextCtrl_StyleSetSize, 3043). +-define(wxStyledTextCtrl_StyleSetFaceName, 3044). +-define(wxStyledTextCtrl_StyleSetEOLFilled, 3045). +-define(wxStyledTextCtrl_StyleResetDefault, 3046). +-define(wxStyledTextCtrl_StyleSetUnderline, 3047). +-define(wxStyledTextCtrl_StyleSetCase, 3048). +-define(wxStyledTextCtrl_StyleSetHotSpot, 3049). +-define(wxStyledTextCtrl_SetSelForeground, 3050). +-define(wxStyledTextCtrl_SetSelBackground, 3051). +-define(wxStyledTextCtrl_GetSelAlpha, 3052). +-define(wxStyledTextCtrl_SetSelAlpha, 3053). +-define(wxStyledTextCtrl_SetCaretForeground, 3054). +-define(wxStyledTextCtrl_CmdKeyAssign, 3055). +-define(wxStyledTextCtrl_CmdKeyClear, 3056). +-define(wxStyledTextCtrl_CmdKeyClearAll, 3057). +-define(wxStyledTextCtrl_SetStyleBytes, 3058). +-define(wxStyledTextCtrl_StyleSetVisible, 3059). +-define(wxStyledTextCtrl_GetCaretPeriod, 3060). +-define(wxStyledTextCtrl_SetCaretPeriod, 3061). +-define(wxStyledTextCtrl_SetWordChars, 3062). +-define(wxStyledTextCtrl_BeginUndoAction, 3063). +-define(wxStyledTextCtrl_EndUndoAction, 3064). +-define(wxStyledTextCtrl_IndicatorSetStyle, 3065). +-define(wxStyledTextCtrl_IndicatorGetStyle, 3066). +-define(wxStyledTextCtrl_IndicatorSetForeground, 3067). +-define(wxStyledTextCtrl_IndicatorGetForeground, 3068). +-define(wxStyledTextCtrl_SetWhitespaceForeground, 3069). +-define(wxStyledTextCtrl_SetWhitespaceBackground, 3070). +-define(wxStyledTextCtrl_GetStyleBits, 3071). +-define(wxStyledTextCtrl_SetLineState, 3072). +-define(wxStyledTextCtrl_GetLineState, 3073). +-define(wxStyledTextCtrl_GetMaxLineState, 3074). +-define(wxStyledTextCtrl_GetCaretLineVisible, 3075). +-define(wxStyledTextCtrl_SetCaretLineVisible, 3076). +-define(wxStyledTextCtrl_GetCaretLineBackground, 3077). +-define(wxStyledTextCtrl_SetCaretLineBackground, 3078). +-define(wxStyledTextCtrl_AutoCompShow, 3079). +-define(wxStyledTextCtrl_AutoCompCancel, 3080). +-define(wxStyledTextCtrl_AutoCompActive, 3081). +-define(wxStyledTextCtrl_AutoCompPosStart, 3082). +-define(wxStyledTextCtrl_AutoCompComplete, 3083). +-define(wxStyledTextCtrl_AutoCompStops, 3084). +-define(wxStyledTextCtrl_AutoCompSetSeparator, 3085). +-define(wxStyledTextCtrl_AutoCompGetSeparator, 3086). +-define(wxStyledTextCtrl_AutoCompSelect, 3087). +-define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3088). +-define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3089). +-define(wxStyledTextCtrl_AutoCompSetFillUps, 3090). +-define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3091). +-define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3092). +-define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3093). +-define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3094). +-define(wxStyledTextCtrl_UserListShow, 3095). +-define(wxStyledTextCtrl_AutoCompSetAutoHide, 3096). +-define(wxStyledTextCtrl_AutoCompGetAutoHide, 3097). +-define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3098). +-define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3099). +-define(wxStyledTextCtrl_RegisterImage, 3100). +-define(wxStyledTextCtrl_ClearRegisteredImages, 3101). +-define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3102). +-define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3103). +-define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3104). +-define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3105). +-define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3106). +-define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3107). +-define(wxStyledTextCtrl_SetIndent, 3108). +-define(wxStyledTextCtrl_GetIndent, 3109). +-define(wxStyledTextCtrl_SetUseTabs, 3110). +-define(wxStyledTextCtrl_GetUseTabs, 3111). +-define(wxStyledTextCtrl_SetLineIndentation, 3112). +-define(wxStyledTextCtrl_GetLineIndentation, 3113). +-define(wxStyledTextCtrl_GetLineIndentPosition, 3114). +-define(wxStyledTextCtrl_GetColumn, 3115). +-define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3116). +-define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3117). +-define(wxStyledTextCtrl_SetIndentationGuides, 3118). +-define(wxStyledTextCtrl_GetIndentationGuides, 3119). +-define(wxStyledTextCtrl_SetHighlightGuide, 3120). +-define(wxStyledTextCtrl_GetHighlightGuide, 3121). +-define(wxStyledTextCtrl_GetLineEndPosition, 3122). +-define(wxStyledTextCtrl_GetCodePage, 3123). +-define(wxStyledTextCtrl_GetCaretForeground, 3124). +-define(wxStyledTextCtrl_GetReadOnly, 3125). +-define(wxStyledTextCtrl_SetCurrentPos, 3126). +-define(wxStyledTextCtrl_SetSelectionStart, 3127). +-define(wxStyledTextCtrl_GetSelectionStart, 3128). +-define(wxStyledTextCtrl_SetSelectionEnd, 3129). +-define(wxStyledTextCtrl_GetSelectionEnd, 3130). +-define(wxStyledTextCtrl_SetPrintMagnification, 3131). +-define(wxStyledTextCtrl_GetPrintMagnification, 3132). +-define(wxStyledTextCtrl_SetPrintColourMode, 3133). +-define(wxStyledTextCtrl_GetPrintColourMode, 3134). +-define(wxStyledTextCtrl_FindText, 3135). +-define(wxStyledTextCtrl_FormatRange, 3136). +-define(wxStyledTextCtrl_GetFirstVisibleLine, 3137). +-define(wxStyledTextCtrl_GetLine, 3138). +-define(wxStyledTextCtrl_GetLineCount, 3139). +-define(wxStyledTextCtrl_SetMarginLeft, 3140). +-define(wxStyledTextCtrl_GetMarginLeft, 3141). +-define(wxStyledTextCtrl_SetMarginRight, 3142). +-define(wxStyledTextCtrl_GetMarginRight, 3143). +-define(wxStyledTextCtrl_GetModify, 3144). +-define(wxStyledTextCtrl_SetSelection, 3145). +-define(wxStyledTextCtrl_GetSelectedText, 3146). +-define(wxStyledTextCtrl_GetTextRange, 3147). +-define(wxStyledTextCtrl_HideSelection, 3148). +-define(wxStyledTextCtrl_LineFromPosition, 3149). +-define(wxStyledTextCtrl_PositionFromLine, 3150). +-define(wxStyledTextCtrl_LineScroll, 3151). +-define(wxStyledTextCtrl_EnsureCaretVisible, 3152). +-define(wxStyledTextCtrl_ReplaceSelection, 3153). +-define(wxStyledTextCtrl_SetReadOnly, 3154). +-define(wxStyledTextCtrl_CanPaste, 3155). +-define(wxStyledTextCtrl_CanUndo, 3156). +-define(wxStyledTextCtrl_EmptyUndoBuffer, 3157). +-define(wxStyledTextCtrl_Undo, 3158). +-define(wxStyledTextCtrl_Cut, 3159). +-define(wxStyledTextCtrl_Copy, 3160). +-define(wxStyledTextCtrl_Paste, 3161). +-define(wxStyledTextCtrl_Clear, 3162). +-define(wxStyledTextCtrl_SetText, 3163). +-define(wxStyledTextCtrl_GetText, 3164). +-define(wxStyledTextCtrl_GetTextLength, 3165). +-define(wxStyledTextCtrl_GetOvertype, 3166). +-define(wxStyledTextCtrl_SetCaretWidth, 3167). +-define(wxStyledTextCtrl_GetCaretWidth, 3168). +-define(wxStyledTextCtrl_SetTargetStart, 3169). +-define(wxStyledTextCtrl_GetTargetStart, 3170). +-define(wxStyledTextCtrl_SetTargetEnd, 3171). +-define(wxStyledTextCtrl_GetTargetEnd, 3172). +-define(wxStyledTextCtrl_ReplaceTarget, 3173). +-define(wxStyledTextCtrl_SearchInTarget, 3174). +-define(wxStyledTextCtrl_SetSearchFlags, 3175). +-define(wxStyledTextCtrl_GetSearchFlags, 3176). +-define(wxStyledTextCtrl_CallTipShow, 3177). +-define(wxStyledTextCtrl_CallTipCancel, 3178). +-define(wxStyledTextCtrl_CallTipActive, 3179). +-define(wxStyledTextCtrl_CallTipPosAtStart, 3180). +-define(wxStyledTextCtrl_CallTipSetHighlight, 3181). +-define(wxStyledTextCtrl_CallTipSetBackground, 3182). +-define(wxStyledTextCtrl_CallTipSetForeground, 3183). +-define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3184). +-define(wxStyledTextCtrl_CallTipUseStyle, 3185). +-define(wxStyledTextCtrl_VisibleFromDocLine, 3186). +-define(wxStyledTextCtrl_DocLineFromVisible, 3187). +-define(wxStyledTextCtrl_WrapCount, 3188). +-define(wxStyledTextCtrl_SetFoldLevel, 3189). +-define(wxStyledTextCtrl_GetFoldLevel, 3190). +-define(wxStyledTextCtrl_GetLastChild, 3191). +-define(wxStyledTextCtrl_GetFoldParent, 3192). +-define(wxStyledTextCtrl_ShowLines, 3193). +-define(wxStyledTextCtrl_HideLines, 3194). +-define(wxStyledTextCtrl_GetLineVisible, 3195). +-define(wxStyledTextCtrl_SetFoldExpanded, 3196). +-define(wxStyledTextCtrl_GetFoldExpanded, 3197). +-define(wxStyledTextCtrl_ToggleFold, 3198). +-define(wxStyledTextCtrl_EnsureVisible, 3199). +-define(wxStyledTextCtrl_SetFoldFlags, 3200). +-define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3201). +-define(wxStyledTextCtrl_SetTabIndents, 3202). +-define(wxStyledTextCtrl_GetTabIndents, 3203). +-define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3204). +-define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3205). +-define(wxStyledTextCtrl_SetMouseDwellTime, 3206). +-define(wxStyledTextCtrl_GetMouseDwellTime, 3207). +-define(wxStyledTextCtrl_WordStartPosition, 3208). +-define(wxStyledTextCtrl_WordEndPosition, 3209). +-define(wxStyledTextCtrl_SetWrapMode, 3210). +-define(wxStyledTextCtrl_GetWrapMode, 3211). +-define(wxStyledTextCtrl_SetWrapVisualFlags, 3212). +-define(wxStyledTextCtrl_GetWrapVisualFlags, 3213). +-define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3214). +-define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3215). +-define(wxStyledTextCtrl_SetWrapStartIndent, 3216). +-define(wxStyledTextCtrl_GetWrapStartIndent, 3217). +-define(wxStyledTextCtrl_SetLayoutCache, 3218). +-define(wxStyledTextCtrl_GetLayoutCache, 3219). +-define(wxStyledTextCtrl_SetScrollWidth, 3220). +-define(wxStyledTextCtrl_GetScrollWidth, 3221). +-define(wxStyledTextCtrl_TextWidth, 3222). +-define(wxStyledTextCtrl_GetEndAtLastLine, 3223). +-define(wxStyledTextCtrl_TextHeight, 3224). +-define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3225). +-define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3226). +-define(wxStyledTextCtrl_AppendText, 3227). +-define(wxStyledTextCtrl_GetTwoPhaseDraw, 3228). +-define(wxStyledTextCtrl_SetTwoPhaseDraw, 3229). +-define(wxStyledTextCtrl_TargetFromSelection, 3230). +-define(wxStyledTextCtrl_LinesJoin, 3231). +-define(wxStyledTextCtrl_LinesSplit, 3232). +-define(wxStyledTextCtrl_SetFoldMarginColour, 3233). +-define(wxStyledTextCtrl_SetFoldMarginHiColour, 3234). +-define(wxStyledTextCtrl_LineDown, 3235). +-define(wxStyledTextCtrl_LineDownExtend, 3236). +-define(wxStyledTextCtrl_LineUp, 3237). +-define(wxStyledTextCtrl_LineUpExtend, 3238). +-define(wxStyledTextCtrl_CharLeft, 3239). +-define(wxStyledTextCtrl_CharLeftExtend, 3240). +-define(wxStyledTextCtrl_CharRight, 3241). +-define(wxStyledTextCtrl_CharRightExtend, 3242). +-define(wxStyledTextCtrl_WordLeft, 3243). +-define(wxStyledTextCtrl_WordLeftExtend, 3244). +-define(wxStyledTextCtrl_WordRight, 3245). +-define(wxStyledTextCtrl_WordRightExtend, 3246). +-define(wxStyledTextCtrl_Home, 3247). +-define(wxStyledTextCtrl_HomeExtend, 3248). +-define(wxStyledTextCtrl_LineEnd, 3249). +-define(wxStyledTextCtrl_LineEndExtend, 3250). +-define(wxStyledTextCtrl_DocumentStart, 3251). +-define(wxStyledTextCtrl_DocumentStartExtend, 3252). +-define(wxStyledTextCtrl_DocumentEnd, 3253). +-define(wxStyledTextCtrl_DocumentEndExtend, 3254). +-define(wxStyledTextCtrl_PageUp, 3255). +-define(wxStyledTextCtrl_PageUpExtend, 3256). +-define(wxStyledTextCtrl_PageDown, 3257). +-define(wxStyledTextCtrl_PageDownExtend, 3258). +-define(wxStyledTextCtrl_EditToggleOvertype, 3259). +-define(wxStyledTextCtrl_Cancel, 3260). +-define(wxStyledTextCtrl_DeleteBack, 3261). +-define(wxStyledTextCtrl_Tab, 3262). +-define(wxStyledTextCtrl_BackTab, 3263). +-define(wxStyledTextCtrl_NewLine, 3264). +-define(wxStyledTextCtrl_FormFeed, 3265). +-define(wxStyledTextCtrl_VCHome, 3266). +-define(wxStyledTextCtrl_VCHomeExtend, 3267). +-define(wxStyledTextCtrl_ZoomIn, 3268). +-define(wxStyledTextCtrl_ZoomOut, 3269). +-define(wxStyledTextCtrl_DelWordLeft, 3270). +-define(wxStyledTextCtrl_DelWordRight, 3271). +-define(wxStyledTextCtrl_LineCut, 3272). +-define(wxStyledTextCtrl_LineDelete, 3273). +-define(wxStyledTextCtrl_LineTranspose, 3274). +-define(wxStyledTextCtrl_LineDuplicate, 3275). +-define(wxStyledTextCtrl_LowerCase, 3276). +-define(wxStyledTextCtrl_UpperCase, 3277). +-define(wxStyledTextCtrl_LineScrollDown, 3278). +-define(wxStyledTextCtrl_LineScrollUp, 3279). +-define(wxStyledTextCtrl_DeleteBackNotLine, 3280). +-define(wxStyledTextCtrl_HomeDisplay, 3281). +-define(wxStyledTextCtrl_HomeDisplayExtend, 3282). +-define(wxStyledTextCtrl_LineEndDisplay, 3283). +-define(wxStyledTextCtrl_LineEndDisplayExtend, 3284). +-define(wxStyledTextCtrl_HomeWrapExtend, 3285). +-define(wxStyledTextCtrl_LineEndWrap, 3286). +-define(wxStyledTextCtrl_LineEndWrapExtend, 3287). +-define(wxStyledTextCtrl_VCHomeWrap, 3288). +-define(wxStyledTextCtrl_VCHomeWrapExtend, 3289). +-define(wxStyledTextCtrl_LineCopy, 3290). +-define(wxStyledTextCtrl_MoveCaretInsideView, 3291). +-define(wxStyledTextCtrl_LineLength, 3292). +-define(wxStyledTextCtrl_BraceHighlight, 3293). +-define(wxStyledTextCtrl_BraceBadLight, 3294). +-define(wxStyledTextCtrl_BraceMatch, 3295). +-define(wxStyledTextCtrl_GetViewEOL, 3296). +-define(wxStyledTextCtrl_SetViewEOL, 3297). +-define(wxStyledTextCtrl_SetModEventMask, 3298). +-define(wxStyledTextCtrl_GetEdgeColumn, 3299). +-define(wxStyledTextCtrl_SetEdgeColumn, 3300). +-define(wxStyledTextCtrl_SetEdgeMode, 3301). +-define(wxStyledTextCtrl_GetEdgeMode, 3302). +-define(wxStyledTextCtrl_GetEdgeColour, 3303). +-define(wxStyledTextCtrl_SetEdgeColour, 3304). +-define(wxStyledTextCtrl_SearchAnchor, 3305). +-define(wxStyledTextCtrl_SearchNext, 3306). +-define(wxStyledTextCtrl_SearchPrev, 3307). +-define(wxStyledTextCtrl_LinesOnScreen, 3308). +-define(wxStyledTextCtrl_UsePopUp, 3309). +-define(wxStyledTextCtrl_SelectionIsRectangle, 3310). +-define(wxStyledTextCtrl_SetZoom, 3311). +-define(wxStyledTextCtrl_GetZoom, 3312). +-define(wxStyledTextCtrl_GetModEventMask, 3313). +-define(wxStyledTextCtrl_SetSTCFocus, 3314). +-define(wxStyledTextCtrl_GetSTCFocus, 3315). +-define(wxStyledTextCtrl_SetStatus, 3316). +-define(wxStyledTextCtrl_GetStatus, 3317). +-define(wxStyledTextCtrl_SetMouseDownCaptures, 3318). +-define(wxStyledTextCtrl_GetMouseDownCaptures, 3319). +-define(wxStyledTextCtrl_SetSTCCursor, 3320). +-define(wxStyledTextCtrl_GetSTCCursor, 3321). +-define(wxStyledTextCtrl_SetControlCharSymbol, 3322). +-define(wxStyledTextCtrl_GetControlCharSymbol, 3323). +-define(wxStyledTextCtrl_WordPartLeft, 3324). +-define(wxStyledTextCtrl_WordPartLeftExtend, 3325). +-define(wxStyledTextCtrl_WordPartRight, 3326). +-define(wxStyledTextCtrl_WordPartRightExtend, 3327). +-define(wxStyledTextCtrl_SetVisiblePolicy, 3328). +-define(wxStyledTextCtrl_DelLineLeft, 3329). +-define(wxStyledTextCtrl_DelLineRight, 3330). +-define(wxStyledTextCtrl_GetXOffset, 3331). +-define(wxStyledTextCtrl_ChooseCaretX, 3332). +-define(wxStyledTextCtrl_SetXCaretPolicy, 3333). +-define(wxStyledTextCtrl_SetYCaretPolicy, 3334). +-define(wxStyledTextCtrl_GetPrintWrapMode, 3335). +-define(wxStyledTextCtrl_SetHotspotActiveForeground, 3336). +-define(wxStyledTextCtrl_SetHotspotActiveBackground, 3337). +-define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3338). +-define(wxStyledTextCtrl_SetHotspotSingleLine, 3339). +-define(wxStyledTextCtrl_ParaDownExtend, 3340). +-define(wxStyledTextCtrl_ParaUp, 3341). +-define(wxStyledTextCtrl_ParaUpExtend, 3342). +-define(wxStyledTextCtrl_PositionBefore, 3343). +-define(wxStyledTextCtrl_PositionAfter, 3344). +-define(wxStyledTextCtrl_CopyRange, 3345). +-define(wxStyledTextCtrl_CopyText, 3346). +-define(wxStyledTextCtrl_SetSelectionMode, 3347). +-define(wxStyledTextCtrl_GetSelectionMode, 3348). +-define(wxStyledTextCtrl_LineDownRectExtend, 3349). +-define(wxStyledTextCtrl_LineUpRectExtend, 3350). +-define(wxStyledTextCtrl_CharLeftRectExtend, 3351). +-define(wxStyledTextCtrl_CharRightRectExtend, 3352). +-define(wxStyledTextCtrl_HomeRectExtend, 3353). +-define(wxStyledTextCtrl_VCHomeRectExtend, 3354). +-define(wxStyledTextCtrl_LineEndRectExtend, 3355). +-define(wxStyledTextCtrl_PageUpRectExtend, 3356). +-define(wxStyledTextCtrl_PageDownRectExtend, 3357). +-define(wxStyledTextCtrl_StutteredPageUp, 3358). +-define(wxStyledTextCtrl_StutteredPageUpExtend, 3359). +-define(wxStyledTextCtrl_StutteredPageDown, 3360). +-define(wxStyledTextCtrl_StutteredPageDownExtend, 3361). +-define(wxStyledTextCtrl_WordLeftEnd, 3362). +-define(wxStyledTextCtrl_WordLeftEndExtend, 3363). +-define(wxStyledTextCtrl_WordRightEnd, 3364). +-define(wxStyledTextCtrl_WordRightEndExtend, 3365). +-define(wxStyledTextCtrl_SetWhitespaceChars, 3366). +-define(wxStyledTextCtrl_SetCharsDefault, 3367). +-define(wxStyledTextCtrl_AutoCompGetCurrent, 3368). +-define(wxStyledTextCtrl_Allocate, 3369). +-define(wxStyledTextCtrl_FindColumn, 3370). +-define(wxStyledTextCtrl_GetCaretSticky, 3371). +-define(wxStyledTextCtrl_SetCaretSticky, 3372). +-define(wxStyledTextCtrl_ToggleCaretSticky, 3373). +-define(wxStyledTextCtrl_SetPasteConvertEndings, 3374). +-define(wxStyledTextCtrl_GetPasteConvertEndings, 3375). +-define(wxStyledTextCtrl_SelectionDuplicate, 3376). +-define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3377). +-define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3378). +-define(wxStyledTextCtrl_StartRecord, 3379). +-define(wxStyledTextCtrl_StopRecord, 3380). +-define(wxStyledTextCtrl_SetLexer, 3381). +-define(wxStyledTextCtrl_GetLexer, 3382). +-define(wxStyledTextCtrl_Colourise, 3383). +-define(wxStyledTextCtrl_SetProperty, 3384). +-define(wxStyledTextCtrl_SetKeyWords, 3385). +-define(wxStyledTextCtrl_SetLexerLanguage, 3386). +-define(wxStyledTextCtrl_GetProperty, 3387). +-define(wxStyledTextCtrl_GetStyleBitsNeeded, 3388). +-define(wxStyledTextCtrl_GetCurrentLine, 3389). +-define(wxStyledTextCtrl_StyleSetSpec, 3390). +-define(wxStyledTextCtrl_StyleSetFont, 3391). +-define(wxStyledTextCtrl_StyleSetFontAttr, 3392). +-define(wxStyledTextCtrl_StyleSetCharacterSet, 3393). +-define(wxStyledTextCtrl_StyleSetFontEncoding, 3394). +-define(wxStyledTextCtrl_CmdKeyExecute, 3395). +-define(wxStyledTextCtrl_SetMargins, 3396). +-define(wxStyledTextCtrl_GetSelection, 3397). +-define(wxStyledTextCtrl_PointFromPosition, 3398). +-define(wxStyledTextCtrl_ScrollToLine, 3399). +-define(wxStyledTextCtrl_ScrollToColumn, 3400). +-define(wxStyledTextCtrl_SetVScrollBar, 3401). +-define(wxStyledTextCtrl_SetHScrollBar, 3402). +-define(wxStyledTextCtrl_GetLastKeydownProcessed, 3403). +-define(wxStyledTextCtrl_SetLastKeydownProcessed, 3404). +-define(wxStyledTextCtrl_SaveFile, 3405). +-define(wxStyledTextCtrl_LoadFile, 3406). +-define(wxStyledTextCtrl_DoDragOver, 3407). +-define(wxStyledTextCtrl_DoDropText, 3408). +-define(wxStyledTextCtrl_GetUseAntiAliasing, 3409). +-define(wxStyledTextCtrl_AddTextRaw, 3410). +-define(wxStyledTextCtrl_InsertTextRaw, 3411). +-define(wxStyledTextCtrl_GetCurLineRaw, 3412). +-define(wxStyledTextCtrl_GetLineRaw, 3413). +-define(wxStyledTextCtrl_GetSelectedTextRaw, 3414). +-define(wxStyledTextCtrl_GetTextRangeRaw, 3415). +-define(wxStyledTextCtrl_SetTextRaw, 3416). +-define(wxStyledTextCtrl_GetTextRaw, 3417). +-define(wxStyledTextCtrl_AppendTextRaw, 3418). +-define(wxArtProvider_GetBitmap, 3419). +-define(wxArtProvider_GetIcon, 3420). +-define(wxTreeEvent_GetKeyCode, 3421). +-define(wxTreeEvent_GetItem, 3422). +-define(wxTreeEvent_GetKeyEvent, 3423). +-define(wxTreeEvent_GetLabel, 3424). +-define(wxTreeEvent_GetOldItem, 3425). +-define(wxTreeEvent_GetPoint, 3426). +-define(wxTreeEvent_IsEditCancelled, 3427). +-define(wxTreeEvent_SetToolTip, 3428). +-define(wxNotebookEvent_GetOldSelection, 3429). +-define(wxNotebookEvent_GetSelection, 3430). +-define(wxNotebookEvent_SetOldSelection, 3431). +-define(wxNotebookEvent_SetSelection, 3432). +-define(wxFileDataObject_new, 3433). +-define(wxFileDataObject_AddFile, 3434). +-define(wxFileDataObject_GetFilenames, 3435). +-define(wxFileDataObject_destroy, 3436). +-define(wxTextDataObject_new, 3437). +-define(wxTextDataObject_GetTextLength, 3438). +-define(wxTextDataObject_GetText, 3439). +-define(wxTextDataObject_SetText, 3440). +-define(wxTextDataObject_destroy, 3441). +-define(wxBitmapDataObject_new_1_1, 3442). +-define(wxBitmapDataObject_new_1_0, 3443). +-define(wxBitmapDataObject_GetBitmap, 3444). +-define(wxBitmapDataObject_SetBitmap, 3445). +-define(wxBitmapDataObject_destroy, 3446). +-define(wxClipboard_new, 3448). +-define(wxClipboard_destruct, 3449). +-define(wxClipboard_AddData, 3450). +-define(wxClipboard_Clear, 3451). +-define(wxClipboard_Close, 3452). +-define(wxClipboard_Flush, 3453). +-define(wxClipboard_GetData, 3454). +-define(wxClipboard_IsOpened, 3455). +-define(wxClipboard_Open, 3456). +-define(wxClipboard_SetData, 3457). +-define(wxClipboard_UsePrimarySelection, 3459). +-define(wxClipboard_IsSupported, 3460). +-define(wxClipboard_Get, 3461). +-define(wxSpinEvent_GetPosition, 3462). +-define(wxSpinEvent_SetPosition, 3463). +-define(wxSplitterWindow_new_0, 3464). +-define(wxSplitterWindow_new_2, 3465). +-define(wxSplitterWindow_destruct, 3466). +-define(wxSplitterWindow_Create, 3467). +-define(wxSplitterWindow_GetMinimumPaneSize, 3468). +-define(wxSplitterWindow_GetSashGravity, 3469). +-define(wxSplitterWindow_GetSashPosition, 3470). +-define(wxSplitterWindow_GetSplitMode, 3471). +-define(wxSplitterWindow_GetWindow1, 3472). +-define(wxSplitterWindow_GetWindow2, 3473). +-define(wxSplitterWindow_Initialize, 3474). +-define(wxSplitterWindow_IsSplit, 3475). +-define(wxSplitterWindow_ReplaceWindow, 3476). +-define(wxSplitterWindow_SetSashGravity, 3477). +-define(wxSplitterWindow_SetSashPosition, 3478). +-define(wxSplitterWindow_SetSashSize, 3479). +-define(wxSplitterWindow_SetMinimumPaneSize, 3480). +-define(wxSplitterWindow_SetSplitMode, 3481). +-define(wxSplitterWindow_SplitHorizontally, 3482). +-define(wxSplitterWindow_SplitVertically, 3483). +-define(wxSplitterWindow_Unsplit, 3484). +-define(wxSplitterWindow_UpdateSize, 3485). +-define(wxSplitterEvent_GetSashPosition, 3486). +-define(wxSplitterEvent_GetX, 3487). +-define(wxSplitterEvent_GetY, 3488). +-define(wxSplitterEvent_GetWindowBeingRemoved, 3489). +-define(wxSplitterEvent_SetSashPosition, 3490). +-define(wxHtmlWindow_new_0, 3491). +-define(wxHtmlWindow_new_2, 3492). +-define(wxHtmlWindow_AppendToPage, 3493). +-define(wxHtmlWindow_GetOpenedAnchor, 3494). +-define(wxHtmlWindow_GetOpenedPage, 3495). +-define(wxHtmlWindow_GetOpenedPageTitle, 3496). +-define(wxHtmlWindow_GetRelatedFrame, 3497). +-define(wxHtmlWindow_HistoryBack, 3498). +-define(wxHtmlWindow_HistoryCanBack, 3499). +-define(wxHtmlWindow_HistoryCanForward, 3500). +-define(wxHtmlWindow_HistoryClear, 3501). +-define(wxHtmlWindow_HistoryForward, 3502). +-define(wxHtmlWindow_LoadFile, 3503). +-define(wxHtmlWindow_LoadPage, 3504). +-define(wxHtmlWindow_SelectAll, 3505). +-define(wxHtmlWindow_SelectionToText, 3506). +-define(wxHtmlWindow_SelectLine, 3507). +-define(wxHtmlWindow_SelectWord, 3508). +-define(wxHtmlWindow_SetBorders, 3509). +-define(wxHtmlWindow_SetFonts, 3510). +-define(wxHtmlWindow_SetPage, 3511). +-define(wxHtmlWindow_SetRelatedFrame, 3512). +-define(wxHtmlWindow_SetRelatedStatusBar, 3513). +-define(wxHtmlWindow_ToText, 3514). +-define(wxHtmlWindow_destroy, 3515). +-define(wxHtmlLinkEvent_GetLinkInfo, 3516). +-define(wxSystemSettings_GetColour, 3517). +-define(wxSystemSettings_GetFont, 3518). +-define(wxSystemSettings_GetMetric, 3519). +-define(wxSystemSettings_GetScreenType, 3520). +-define(wxSystemOptions_GetOption, 3521). +-define(wxSystemOptions_GetOptionInt, 3522). +-define(wxSystemOptions_HasOption, 3523). +-define(wxSystemOptions_IsFalse, 3524). +-define(wxSystemOptions_SetOption_2_1, 3525). +-define(wxSystemOptions_SetOption_2_0, 3526). +-define(wxAuiNotebookEvent_SetSelection, 3527). +-define(wxAuiNotebookEvent_GetSelection, 3528). +-define(wxAuiNotebookEvent_SetOldSelection, 3529). +-define(wxAuiNotebookEvent_GetOldSelection, 3530). +-define(wxAuiNotebookEvent_SetDragSource, 3531). +-define(wxAuiNotebookEvent_GetDragSource, 3532). +-define(wxAuiManagerEvent_SetManager, 3533). +-define(wxAuiManagerEvent_GetManager, 3534). +-define(wxAuiManagerEvent_SetPane, 3535). +-define(wxAuiManagerEvent_GetPane, 3536). +-define(wxAuiManagerEvent_SetButton, 3537). +-define(wxAuiManagerEvent_GetButton, 3538). +-define(wxAuiManagerEvent_SetDC, 3539). +-define(wxAuiManagerEvent_GetDC, 3540). +-define(wxAuiManagerEvent_Veto, 3541). +-define(wxAuiManagerEvent_GetVeto, 3542). +-define(wxAuiManagerEvent_SetCanVeto, 3543). +-define(wxAuiManagerEvent_CanVeto, 3544). +-define(wxLogNull_new, 3545). +-define(wxLogNull_destroy, 3546). +-define(wxTaskBarIcon_new, 3547). +-define(wxTaskBarIcon_destruct, 3548). +-define(wxTaskBarIcon_PopupMenu, 3549). +-define(wxTaskBarIcon_RemoveIcon, 3550). +-define(wxTaskBarIcon_SetIcon, 3551). +-define(wxLocale_new_0, 3552). +-define(wxLocale_new_2, 3554). +-define(wxLocale_destruct, 3555). +-define(wxLocale_Init, 3557). +-define(wxLocale_AddCatalog_1, 3558). +-define(wxLocale_AddCatalog_3, 3559). +-define(wxLocale_AddCatalogLookupPathPrefix, 3560). +-define(wxLocale_GetCanonicalName, 3561). +-define(wxLocale_GetLanguage, 3562). +-define(wxLocale_GetLanguageName, 3563). +-define(wxLocale_GetLocale, 3564). +-define(wxLocale_GetName, 3565). +-define(wxLocale_GetString_2, 3566). +-define(wxLocale_GetString_4, 3567). +-define(wxLocale_GetHeaderValue, 3568). +-define(wxLocale_GetSysName, 3569). +-define(wxLocale_GetSystemEncoding, 3570). +-define(wxLocale_GetSystemEncodingName, 3571). +-define(wxLocale_GetSystemLanguage, 3572). +-define(wxLocale_IsLoaded, 3573). +-define(wxLocale_IsOk, 3574). +-define(wxActivateEvent_GetActive, 3575). +-define(wxPopupWindow_new_2, 3577). +-define(wxPopupWindow_new_0, 3578). +-define(wxPopupWindow_destruct, 3580). +-define(wxPopupWindow_Create, 3581). +-define(wxPopupWindow_Position, 3582). +-define(wxPopupTransientWindow_new_0, 3583). +-define(wxPopupTransientWindow_new_2, 3584). +-define(wxPopupTransientWindow_destruct, 3585). +-define(wxPopupTransientWindow_Popup, 3586). +-define(wxPopupTransientWindow_Dismiss, 3587). +-define(wxOverlay_new, 3588). +-define(wxOverlay_destruct, 3589). +-define(wxOverlay_Reset, 3590). +-define(wxDCOverlay_new_6, 3591). +-define(wxDCOverlay_new_2, 3592). +-define(wxDCOverlay_destruct, 3593). +-define(wxDCOverlay_Clear, 3594). diff --git a/lib/wx/test/wx_class_SUITE.erl b/lib/wx/test/wx_class_SUITE.erl index f88c10f987..6944a78360 100644 --- a/lib/wx/test/wx_class_SUITE.erl +++ b/lib/wx/test/wx_class_SUITE.erl @@ -643,8 +643,11 @@ modal(Config) -> wx:set_env(Env), modal_dialog(Frame, 1, Tester) end), - receive {dialog, M1, 1} -> timer:sleep(200), ets:insert(test_state, {M1, ready}) end, - receive {dialog, M2, 2} -> timer:sleep(200), ets:insert(test_state, {M2, ready}) end, + %% need to sleep so we know that the window is stuck in + %% the ShowModal event loop and not in an earlier event loop + %% wx2.8 invokes the event loop from more calls than wx-3 + receive {dialog, M1, 1} -> timer:sleep(1200), ets:insert(test_state, {M1, ready}) end, + receive {dialog, M2, 2} -> timer:sleep(1200), ets:insert(test_state, {M2, ready}) end, receive done -> ok end, receive {dialog_done, M2, 2} -> M2 end, diff --git a/otp_versions.table b/otp_versions.table index 79e1c14c49..f68986d831 100644 --- a/otp_versions.table +++ b/otp_versions.table @@ -1,3 +1,4 @@ +OTP-18.3.3 : common_test-1.12.1 inets-6.2.3 ssl-7.3.2 # asn1-4.0.2 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : OTP-18.3.2 : inets-6.2.2 ssl-7.3.1 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : OTP-18.3.1 : erts-7.3.1 inets-6.2.1 mnesia-4.13.4 # asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 ssl-7.3 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 : OTP-18.3 : asn1-4.0.2 common_test-1.12 compiler-6.0.3 cosNotification-1.2.1 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3 eunit-2.2.13 hipe-3.15 inets-6.2 kernel-4.2 mnesia-4.13.3 observer-2.1.2 orber-3.8.1 public_key-1.1.1 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 ssl-7.3 stdlib-2.8 test_server-3.10 tools-2.8.3 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 # cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosProperty-1.2 et-1.5.1 gs-1.6 ic-4.4 jinterface-1.6.1 megaco-3.18 odbc-2.11.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 reltool-0.7 syntax_tools-1.7 typer-0.9.10 : diff --git a/system/doc/design_principles/code_lock.dia b/system/doc/design_principles/code_lock.dia Binary files differindex bed6d8ee86..8e6ff8a898 100644 --- a/system/doc/design_principles/code_lock.dia +++ b/system/doc/design_principles/code_lock.dia diff --git a/system/doc/design_principles/code_lock.png b/system/doc/design_principles/code_lock.png Binary files differindex e40f0320aa..745fd91920 100644 --- a/system/doc/design_principles/code_lock.png +++ b/system/doc/design_principles/code_lock.png diff --git a/system/doc/design_principles/code_lock_2.dia b/system/doc/design_principles/code_lock_2.dia Binary files differindex 4e82a9e1d6..142909a2f5 100644 --- a/system/doc/design_principles/code_lock_2.dia +++ b/system/doc/design_principles/code_lock_2.dia diff --git a/system/doc/design_principles/code_lock_2.png b/system/doc/design_principles/code_lock_2.png Binary files differindex 138fbdef6c..ecf7b0d799 100644 --- a/system/doc/design_principles/code_lock_2.png +++ b/system/doc/design_principles/code_lock_2.png diff --git a/system/doc/design_principles/fsm.xml b/system/doc/design_principles/fsm.xml index 3468f93ae0..4f2b75e6e8 100644 --- a/system/doc/design_principles/fsm.xml +++ b/system/doc/design_principles/fsm.xml @@ -33,7 +33,7 @@ <note> <p> There is a new behaviour - <seealso marker="gen_statem"><c>gen_statem</c></seealso> + <seealso marker="statem"><c>gen_statem</c></seealso> that is intended to replace <c>gen_fsm</c> for new code. It has the same features and add some really useful. This module will not be removed for the foreseeable future diff --git a/system/doc/reference_manual/code_loading.xml b/system/doc/reference_manual/code_loading.xml index e9da40e02f..f6fd2911fa 100644 --- a/system/doc/reference_manual/code_loading.xml +++ b/system/doc/reference_manual/code_loading.xml @@ -130,26 +130,6 @@ loop() -> <marker id="on_load"></marker> <title>Running a Function When a Module is Loaded</title> - <warning> - <p>The <c>on_load</c> feature is to be considered experimental - as there are a number of known weak points in current semantics, - which therefore might change in future Erlang/OTP releases:</p> - <list> - <item><p>Doing external call in <c>on_load</c> to the module itself - leads to deadlock.</p></item> - <item><p>At module upgrade, other processes calling the module - get suspended waiting for <c>on_load</c> to finish. This can be very bad - for applications with demands on realtime characteristics.</p></item> - <item><p>At module upgrade, no rollback is done if the - <c>on_load</c> function fails. - The system is left in a bad limbo state without any working - and reachable instance of the module.</p></item> - </list> - <p>The problems with module upgrade described above can be fixed in future - Erlang/OTP releases by changing the behaviour to not make the module reachable until - after the <c>on_load</c> function has successfully returned.</p> - </warning> - <p>The <c>-on_load()</c> directive names a function that is to be run automatically when a module is loaded.</p> <p>Its syntax is as follows:</p> @@ -159,20 +139,35 @@ loop() -> <p>It is not necessary to export the function. It is called in a freshly spawned process (which terminates as soon as the function - returns). The function must return <c>ok</c> if the module is to - remain loaded and become callable, or any other value if the module - is to be unloaded. Generating an exception also causes the - module to be unloaded. If the return value is not an atom, - a warning error report is sent to the error logger.</p> - - <p>A process that calls any function in a module whose <c>on_load</c> - function has not yet returned, is suspended until the <c>on_load</c> - function has returned.</p> + returns).</p> + + <p>The function must return <c>ok</c> if the module is to + become the new current code for the module and become + callable.</p> + + <p>Returning any other value or generating an exception + causes the new code to be unloaded. If the return value is not an + atom, a warning error report is sent to the error logger.</p> + + <p>If there already is current code for the module, that code will + remain current and can be called until the <c>on_load</c> function + has returned. If the <c>on_load</c> function fails, the current + code (if any) will remain current. If there is no current code for + a module, any process that makes an external call to the module + before the <c>on_load</c> function has finished will be suspended + until the <c>on_load</c> function have finished.</p> + + <note> + <p>Before OTP 19, if the <c>on_load</c> function failed, any + previously current code would become old, essentially leaving + the system without any working and reachable instance of the + module. That problem has been eliminated in OTP 19.</p> + </note> <p>In embedded mode, first all modules are loaded. Then all <c>on_load</c> functions are called. The system is terminated unless all of the <c>on_load</c> functions return - <c>ok</c></p>. + <c>ok</c>.</p> <p><em>Example:</em></p> diff --git a/system/doc/reference_manual/macros.xml b/system/doc/reference_manual/macros.xml index 42ea639b54..350bb1d123 100644 --- a/system/doc/reference_manual/macros.xml +++ b/system/doc/reference_manual/macros.xml @@ -234,6 +234,53 @@ or </section> <section> + <title>-error() and -warning() directives</title> + + <p>The directive <c>-error(Term)</c> causes a compilation error.</p> + + <p><em>Example:</em></p> + <code type="none"> +-module(t). +-export([version/0]). + +-ifdef(VERSION). +version() -> ?VERSION. +-else. +-error("Macro VERSION must be defined."). +version() -> "". +-endif.</code> + + <p>The error message will look like this:</p> + + <pre> +% <input>erlc t.erl</input> +t.erl:7: -error("Macro VERSION must be defined.").</pre> + + <p>The directive <c>-warning(Term)</c> causes a compilation warning.</p> + + <p><em>Example:</em></p> + <code type="none"> +-module(t). +-export([version/0]). + +-ifndef(VERSION). +-warning("Macro VERSION not defined -- using default version."). +-define(VERSION, "0"). +-endif. +version() -> ?VERSION.</code> + + <p>The warning message will look like this:</p> + + <pre> +% <input>erlc t.erl</input> +t.erl:5: Warning: -warning("Macro VERSION not defined -- using default version.").</pre> + + <p>The <c>-error()</c> and <c>-warning()</c> directives were added + in OTP 19.</p> + + </section> + + <section> <title>Stringifying Macro Arguments</title> <p>The construction <c>??Arg</c>, where <c>Arg</c> is a macro argument, is expanded to a string containing the tokens of @@ -253,5 +300,6 @@ io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).</code <p>That is, a trace output, with both the function called and the resulting value.</p> </section> + </chapter> |