fixed gc protection

This commit is contained in:
frese 2003-05-02 15:29:09 +00:00
parent 87b35c474c
commit 629bfa1d73
4 changed files with 70 additions and 47 deletions

View File

@ -4,10 +4,12 @@
s48_value scx_Intern_Atom(s48_value display, s48_value name,
s48_value only_if_exists) {
Atom a = XInternAtom(scx_extract_display(display),
s48_extract_string(name),
S48_EXTRACT_BOOLEAN(only_if_exists));
return scx_enter_atom(a);
Atom a;
S48_DECLARE_GC_PROTECT_3(display, name, only_if_exists);
a = XInternAtom(scx_extract_display(display),
s48_extract_string(name),
S48_EXTRACT_BOOLEAN(only_if_exists));
S48_GC_RETURN(scx_enter_atom(a));
}
s48_value scx_Intern_Atoms(s48_value display, s48_value names,
@ -15,53 +17,52 @@ s48_value scx_Intern_Atoms(s48_value display, s48_value names,
int i, n = s48_list_length(names);
char* cnames[n];
Atom atoms[n];
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT_4(display, names, only_if_exists, l);
for (i = 0; i < n; i++)
cnames[i] = s48_extract_string(names);
if (!XInternAtoms(scx_extract_display(display),
cnames, n,
S48_EXTRACT_BOOLEAN(only_if_exists),
atoms))
return S48_FALSE;
S48_GC_RETURN(S48_FALSE);
else {
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(l);
for (i = n-1; i >= 0; i--)
l = s48_cons(scx_enter_atom(atoms[i]), l);
return l;
S48_GC_RETURN(l);
}
}
s48_value scx_Get_Atom_Name(s48_value display, s48_value a) {
char* s;
s48_value str;
S48_DECLARE_GC_PROTECT_3(display, a, str);
s = XGetAtomName(scx_extract_display(display),
scx_extract_atom(a));
str = s48_enter_string(s);
XFree(s);
return str;
S48_GC_RETURN(str);
}
s48_value scx_List_Properties(s48_value display, s48_value window) {
int n, i;
Atom *atoms;
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT(1);
S48_DECLARE_GC_PROTECT_3(display, window, l);
atoms = XListProperties (scx_extract_display(display),
scx_extract_window(window), &n);
S48_GC_PROTECT_1(l);
for (i = n-1; i >= 0; i--)
l = s48_cons(scx_enter_atom(atoms[i]), l);
S48_GC_UNPROTECT();
XFree ((char*)atoms);
return l;
S48_GC_RETURN(l);
}
s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
s48_value properties, s48_value delta) {
int i, n = s48_list_length(properties);
Atom p[n];
S48_DECLARE_GC_PROTECT_4(display, window, properties, delta);
for (i = 0; i < n; i++) {
p[i] = scx_extract_atom(S48_CAR(properties));
properties = S48_CDR(properties);
@ -69,14 +70,15 @@ s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
XRotateWindowProperties(scx_extract_display(display),
scx_extract_window(window),
p, n, s48_extract_integer(delta));
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Delete_Property(s48_value display, s48_value window,
s48_value prop) {
S48_DECLARE_GC_PROTECT_3(display, window, prop);
XDeleteProperty(scx_extract_display(display), scx_extract_window(window),
scx_extract_atom(prop));
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_property_binding = S48_FALSE;
@ -87,6 +89,7 @@ void scx_extract_property(s48_value p, Atom* type, int* format,
char** data, int* nelements) {
int i;
s48_value d = S48_RECORD_REF(p, 2);
S48_DECLARE_GC_PROTECT_2(p, d);
s48_check_record_type(p, scx_property_binding);
*type = scx_extract_atom(S48_RECORD_REF(p, 0));
*format = S48_EXTRACT_ENUM(S48_RECORD_REF(p, 1),
@ -117,6 +120,7 @@ void scx_extract_property(s48_value p, Atom* type, int* format,
}
break;
}
S48_GC_UNPROTECT();
}
s48_value scx_enter_property(Atom type, int format, char* data,
@ -161,6 +165,9 @@ s48_value scx_Get_Window_Property(s48_value display, s48_value window,
int format, i;
unsigned long nitems, bytes_left;
unsigned char* data = NULL;
s48_value p = S48_FALSE, res = S48_NULL;
S48_DECLARE_GC_PROTECT_9(display, window, atom, start, len, deletep,
req_type, p, res);
if (XGetWindowProperty (scx_extract_display(display),
scx_extract_window(window),
scx_extract_atom(atom),
@ -170,18 +177,14 @@ s48_value scx_Get_Window_Property(s48_value display, s48_value window,
scx_extract_atom(req_type),
&actual_type, &format, &nitems,
&bytes_left, &data) == Success) {
s48_value p = scx_enter_property(actual_type, format, data, nitems);
s48_value res = S48_NULL;
S48_DECLARE_GC_PROTECT(1);
p = scx_enter_property(actual_type, format, data, nitems);
XFree(data);
S48_GC_PROTECT_1(p);
res = s48_cons(s48_enter_integer(bytes_left), p);
S48_GC_UNPROTECT();
return res;
S48_GC_RETURN(res);
} else
/* Property does not exists */
return S48_FALSE;
S48_GC_RETURN(S48_FALSE);
}
s48_value scx_change_property_mode_binding = S48_FALSE;
@ -194,6 +197,7 @@ s48_value scx_Change_Property(s48_value display, s48_value window,
Atom type;
int format, nelements;
char* data;
S48_DECLARE_GC_PROTECT_5(display, window, atom, mode, property);
scx_extract_property(property, &type, &format, &data, &nelements);
@ -202,28 +206,34 @@ s48_value scx_Change_Property(s48_value display, s48_value window,
scx_extract_change_property_mode(mode),
data, nelements);
free(data);
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection,
s48_value owner, s48_value time) {
S48_DECLARE_GC_PROTECT_4(display, selection, owner, time);
XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection),
scx_extract_window(owner), scx_extract_time(time));
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Get_Selection_Owner(s48_value display, s48_value selection) {
return scx_enter_window(XGetSelectionOwner(scx_extract_display(display),
scx_extract_atom(selection)));
Window w;
S48_DECLARE_GC_PROTECT_2(display, selection);
w = XGetSelectionOwner(scx_extract_display(display),
scx_extract_atom(selection));
S48_GC_RETURN(scx_enter_window(w));
}
s48_value scx_Convert_Selection(s48_value display, s48_value selection,
s48_value target, s48_value property,
s48_value requestor, s48_value time) {
S48_DECLARE_GC_PROTECT_6(display, selection, target, property, requestor,
time);
XConvertSelection(scx_extract_display(display), scx_extract_atom(selection),
scx_extract_atom(target), scx_extract_atom(property),
scx_extract_window(requestor), scx_extract_time(time));
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
void scx_init_property(void) {

View File

@ -5,6 +5,7 @@
s48_value scx_Draw_Image_String(s48_value display, s48_value drawable,
s48_value gc, s48_value x, s48_value y,
s48_value string) {
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
XDrawImageString(scx_extract_display(display),
scx_extract_drawable(drawable),
scx_extract_gc(gc),
@ -12,7 +13,7 @@ s48_value scx_Draw_Image_String(s48_value display, s48_value drawable,
s48_extract_integer(y),
s48_extract_string(string),
S48_STRING_LENGTH(string));
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable,
@ -20,6 +21,7 @@ s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable,
s48_value string) {
int i, len = s48_list_length(string);
XChar2b chars[len];
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
for (i = 0; i < len; i++) {
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
chars[i].byte2 = s48_extract_char(S48_CDR(S48_CAR(string)));
@ -31,12 +33,13 @@ s48_value scx_Draw_Image_String_16(s48_value display, s48_value drawable,
s48_extract_integer(x),
s48_extract_integer(y),
chars, len);
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_text_item = S48_FALSE;
void scx_extract_text_item(s48_value v, XTextItem* ti) {
S48_DECLARE_GC_PROTECT_1(v);
s48_check_record_type(v, scx_text_item);
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
ti->nchars = S48_STRING_LENGTH(S48_RECORD_REF(v, 0));
@ -48,15 +51,19 @@ void scx_extract_text_item(s48_value v, XTextItem* ti) {
}
ti->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
S48_GC_UNPROTECT();
/* Free all chars arrays! */
}
void scx_extract_text_item_16(s48_value v, XTextItem16* ti) {
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT_2(v, l);
s48_check_record_type(v, scx_text_item);
{
if (S48_RECORD_REF(v, 0) != S48_FALSE) {
s48_value l = S48_RECORD_REF(v, 0);
int i, n = s48_list_length(l);
int i, n;
l = S48_RECORD_REF(v, 0);
n = s48_list_length(l);
XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b));
for (i = n-1; i >= 0; i--) {
ti->chars[i].byte1 = s48_extract_integer(S48_CAR(S48_CAR(l)));
@ -70,6 +77,7 @@ void scx_extract_text_item_16(s48_value v, XTextItem16* ti) {
ti->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
}
S48_GC_UNPROTECT();
/* Free all chars arrays! */
}
@ -78,6 +86,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
s48_value items) {
int i, len = s48_list_length(items);
XTextItem parts[len];
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
for (i = 0; i < len; i++) {
scx_extract_text_item(S48_CAR(items), &parts[i]);
items = S48_CDR(items);
@ -90,7 +99,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
parts, len);
for (i = 0; i < len; i++)
free(parts[i].chars);
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
@ -98,6 +107,7 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
s48_value items) {
int i, len = s48_list_length(items);
XTextItem16 parts[len];
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
for (i = 0; i < len; i++) {
scx_extract_text_item_16(S48_CAR(items), &parts[i]);
items = S48_CDR(items);
@ -110,18 +120,19 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
parts, len);
for (i = 0; i < len; i++)
free(parts[i].chars);
return S48_UNSPECIFIC;
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Text_Extents(s48_value font_struct, s48_value string) {
XCharStruct overall;
int dir, ascent, descent;
S48_DECLARE_GC_PROTECT_2(font_struct, string);
XTextExtents(scx_extract_fontstruct(font_struct),
s48_extract_string(string),
S48_STRING_LENGTH(string),
&dir, &ascent, &descent,
&overall);
return scx_enter_charstruct(&overall);
S48_GC_RETURN(scx_enter_charstruct(&overall));
}
s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) {
@ -129,6 +140,7 @@ s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) {
int dir, ascent, descent;
int i, len = s48_list_length(string);
XChar2b chars[len];
S48_DECLARE_GC_PROTECT_2(font_struct, string);
for (i = 0; i < len; i++) {
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
chars[i].byte2 = s48_extract_char(S48_CDR(S48_CAR(string)));
@ -138,7 +150,7 @@ s48_value scx_Text_Extents_16(s48_value font_struct, s48_value string) {
chars, len,
&dir, &ascent, &descent,
&overall);
return scx_enter_charstruct(&overall);
S48_GC_RETURN(scx_enter_charstruct(&overall));
}
void scx_init_text(void) {

View File

@ -72,12 +72,12 @@ int s48_list_length(s48_value list) {
s48_value scx_enum_set_type_binding = S48_FALSE;
extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) {
s48_value enum_set_type = scx_enum_set_type_binding;
s48_check_record_type(v, enum_set_type);
S48_DECLARE_GC_PROTECT_2(v, type);
s48_check_record_type(v, scx_enum_set_type_binding);
if (S48_UNSAFE_SHARED_BINDING_REF(type) !=
S48_UNSAFE_RECORD_REF(v, 0))
s48_raise_argument_type_error(v);
return s48_extract_integer(S48_UNSAFE_RECORD_REF(v, 1));
S48_GC_RETURN(s48_extract_integer(S48_UNSAFE_RECORD_REF(v, 1)));
}
s48_value s48_enter_enum_set(unsigned long v, s48_value type) {
@ -91,20 +91,21 @@ s48_value s48_enter_enum_set(unsigned long v, s48_value type) {
}
s48_value scx_struct_cache_ref(void* cpointer, s48_value list) {
S48_DECLARE_GC_PROTECT_1(list);
while (list != S48_NULL) {
if (S48_EXTRACT_POINTER(S48_CAR(S48_CAR(list))) == cpointer)
return S48_WEAK_POINTER_REF(S48_CDR(S48_CAR(list)));
S48_GC_RETURN(S48_WEAK_POINTER_REF(S48_CDR(S48_CAR(list))));
list = S48_CDR(list);
}
return S48_FALSE;
S48_GC_RETURN(S48_FALSE);
}
void scx_struct_cache_set(void* cpointer, s48_value* l, s48_value v) {
s48_value list = *l;
s48_value previous = S48_FALSE;
s48_value pair = S48_FALSE;
S48_DECLARE_GC_PROTECT(3);
S48_GC_PROTECT_3(list, pair, previous);
S48_DECLARE_GC_PROTECT(4);
S48_GC_PROTECT_4(v, list, pair, previous);
/* create the new entry */
pair = s48_make_weak_pointer(v);

View File

@ -3,11 +3,12 @@
s48_value scx_Get_Default(s48_value dpy, s48_value program,
s48_value option) {
char* ret;
S48_DECLARE_GC_PROTECT_3(dpy, program, option);
if (ret = XGetDefault(scx_extract_display(dpy),
s48_extract_string(program),
s48_extract_string(option)))
return s48_enter_string(ret);
else return S48_FALSE;
S48_GC_RETURN(s48_enter_string(ret));
else S48_GC_RETURN(S48_FALSE);
}
s48_value scx_Resource_Manager_String(s48_value dpy) {
@ -21,13 +22,12 @@ s48_value scx_Parse_Geometry(s48_value strg) {
s48_value ret;
int x, y, res;
unsigned int w, h;
S48_DECLARE_GC_PROTECT(1);
S48_DECLARE_GC_PROTECT_2(strg, ret);
res = XParseGeometry (s48_extract_string(strg), &x, &y, &w, &h);
ret = s48_make_vector(6, S48_FALSE);
S48_GC_PROTECT_1(ret);
if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE);
if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE);
if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x));