1
0
mirror of https://github.com/rkd77/elinks.git synced 2025-05-18 00:48:57 -04:00

952, 954: Add ecmascript_detach_form_view stub

Anything that frees struct form_view must now call the new function
ecmascript_detach_form_view.  This function should then clear out any
dangling pointers, but that has not yet been implemented.
This commit is contained in:
Kalle Olavi Niemitalo 2008-07-18 19:43:30 +03:00 committed by Kalle Olavi Niemitalo
parent bbadb99dd1
commit 759fbb1142
7 changed files with 36 additions and 4 deletions

View File

@ -214,6 +214,16 @@ ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter,
return result; return result;
} }
void
ecmascript_detach_form_view(struct form_view *fv)
{
#ifdef CONFIG_ECMASCRIPT_SEE
see_detach_form_view(fv);
#else
spidermonkey_detach_form_view(fv);
#endif
}
void ecmascript_detach_form_state(struct form_state *fs) void ecmascript_detach_form_state(struct form_state *fs)
{ {
#ifdef CONFIG_ECMASCRIPT_SEE #ifdef CONFIG_ECMASCRIPT_SEE
@ -242,6 +252,8 @@ ecmascript_reset_state(struct view_state *vs)
* ecmascript_obj pointers are also NULL. However, they might * ecmascript_obj pointers are also NULL. However, they might
* be non-NULL if the ECMAScript objects have been lazily * be non-NULL if the ECMAScript objects have been lazily
* created because of scripts running in sibling HTML frames. */ * created because of scripts running in sibling HTML frames. */
foreach (fv, vs->forms)
ecmascript_detach_form_view(fv);
for (i = 0; i < vs->form_info_len; i++) for (i = 0; i < vs->form_info_len; i++)
ecmascript_detach_form_state(&vs->form_info[i]); ecmascript_detach_form_state(&vs->form_info[i]);
@ -249,9 +261,6 @@ ecmascript_reset_state(struct view_state *vs)
if (vs->ecmascript) if (vs->ecmascript)
ecmascript_put_interpreter(vs->ecmascript); ecmascript_put_interpreter(vs->ecmascript);
foreach (fv, vs->forms)
fv->ecmascript_obj = NULL;
vs->ecmascript = ecmascript_get_interpreter(vs); vs->ecmascript = ecmascript_get_interpreter(vs);
if (!vs->ecmascript) if (!vs->ecmascript)
vs->ecmascript_fragile = 1; vs->ecmascript_fragile = 1;

View File

@ -9,6 +9,7 @@
#include "util/time.h" #include "util/time.h"
struct form_state; struct form_state;
struct form_view;
struct string; struct string;
struct terminal; struct terminal;
struct uri; struct uri;
@ -71,6 +72,7 @@ void ecmascript_free_urls(struct module *module);
struct ecmascript_interpreter *ecmascript_get_interpreter(struct view_state*vs); struct ecmascript_interpreter *ecmascript_get_interpreter(struct view_state*vs);
void ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter); void ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter);
void ecmascript_detach_form_view(struct form_view *fv);
void ecmascript_detach_form_state(struct form_state *fs); void ecmascript_detach_form_state(struct form_state *fs);
void ecmascript_moved_form_state(struct form_state *fs); void ecmascript_moved_form_state(struct form_state *fs);

View File

@ -7,6 +7,7 @@ struct string;
void *see_get_interpreter(struct ecmascript_interpreter *interpreter); void *see_get_interpreter(struct ecmascript_interpreter *interpreter);
void see_put_interpreter(struct ecmascript_interpreter *interpreter); void see_put_interpreter(struct ecmascript_interpreter *interpreter);
#define see_detach_form_view(fv) ((fv)->ecmascript_obj = NULL)
#define see_detach_form_state(fs) ((fs)->ecmascript_obj = NULL) #define see_detach_form_state(fs) ((fs)->ecmascript_obj = NULL)
#define see_moved_form_state(fs) ((void) (fs)) #define see_moved_form_state(fs) ((void) (fs))

View File

@ -7,6 +7,7 @@ struct string;
void *spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter); void *spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter);
void spidermonkey_put_interpreter(struct ecmascript_interpreter *interpreter); void spidermonkey_put_interpreter(struct ecmascript_interpreter *interpreter);
#define spidermonkey_detach_form_view(fv) ((fv)->ecmascript_obj = NULL)
#define spidermonkey_detach_form_state(fs) ((fs)->ecmascript_obj = NULL) #define spidermonkey_detach_form_state(fs) ((fs)->ecmascript_obj = NULL)
#define spidermonkey_moved_form_state(fs) ((void) (fs)) #define spidermonkey_moved_form_state(fs) ((void) (fs))

View File

@ -347,6 +347,18 @@ done_form_state(struct form_state *fs)
mem_free_if(fs->value); mem_free_if(fs->value);
} }
/** Free @a fv and any data owned by it. This does not call
* del_from_list(fv), so the caller must usually do that first.
* @relates form_view */
void
done_form_view(struct form_view *fv)
{
#ifdef CONFIG_ECMASCRIPT
ecmascript_detach_form_view(fv);
#endif
mem_free(fv);
}
int int
get_current_state(struct session *ses) get_current_state(struct session *ses)
{ {

View File

@ -114,6 +114,7 @@ struct form_view *find_form_view(struct document_view *doc_view, struct form *fo
struct form *find_form_by_form_view(struct document *document, struct form_view *fv); struct form *find_form_by_form_view(struct document *document, struct form_view *fv);
void done_form_state(struct form_state *); void done_form_state(struct form_state *);
void done_form_view(struct form_view *);
enum frame_event_status field_op(struct session *ses, struct document_view *doc_view, struct link *link, struct term_event *ev); enum frame_event_status field_op(struct session *ses, struct document_view *doc_view, struct link *link, struct term_event *ev);

View File

@ -45,14 +45,20 @@ init_vs(struct view_state *vs, struct uri *uri, int plain)
void void
destroy_vs(struct view_state *vs, int blast_ecmascript) destroy_vs(struct view_state *vs, int blast_ecmascript)
{ {
struct form_view *fv, *next;
/* form_state contains a pointer to form_view, so it's safest /* form_state contains a pointer to form_view, so it's safest
* to delete the form_state first. */ * to delete the form_state first. */
for (; vs->form_info_len > 0; vs->form_info_len--) for (; vs->form_info_len > 0; vs->form_info_len--)
done_form_state(&vs->form_info[vs->form_info_len - 1]); done_form_state(&vs->form_info[vs->form_info_len - 1]);
mem_free_set(&vs->form_info, NULL); mem_free_set(&vs->form_info, NULL);
foreachsafe (fv, next, vs->forms) {
del_from_list(fv);
done_form_view(fv);
}
if (vs->uri) done_uri(vs->uri); if (vs->uri) done_uri(vs->uri);
free_list(vs->forms);
#ifdef CONFIG_ECMASCRIPT #ifdef CONFIG_ECMASCRIPT
if (blast_ecmascript && vs->ecmascript) if (blast_ecmascript && vs->ecmascript)
ecmascript_put_interpreter(vs->ecmascript); ecmascript_put_interpreter(vs->ecmascript);