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 scx_Intern_Atom(s48_value display, s48_value name,
s48_value only_if_exists) { s48_value only_if_exists) {
Atom a = XInternAtom(scx_extract_display(display), Atom a;
S48_DECLARE_GC_PROTECT_3(display, name, only_if_exists);
a = XInternAtom(scx_extract_display(display),
s48_extract_string(name), s48_extract_string(name),
S48_EXTRACT_BOOLEAN(only_if_exists)); S48_EXTRACT_BOOLEAN(only_if_exists));
return scx_enter_atom(a); S48_GC_RETURN(scx_enter_atom(a));
} }
s48_value scx_Intern_Atoms(s48_value display, s48_value names, 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); int i, n = s48_list_length(names);
char* cnames[n]; char* cnames[n];
Atom atoms[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++) for (i = 0; i < n; i++)
cnames[i] = s48_extract_string(names); cnames[i] = s48_extract_string(names);
if (!XInternAtoms(scx_extract_display(display), if (!XInternAtoms(scx_extract_display(display),
cnames, n, cnames, n,
S48_EXTRACT_BOOLEAN(only_if_exists), S48_EXTRACT_BOOLEAN(only_if_exists),
atoms)) atoms))
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
else { else {
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT(1);
S48_GC_PROTECT_1(l);
for (i = n-1; i >= 0; i--) for (i = n-1; i >= 0; i--)
l = s48_cons(scx_enter_atom(atoms[i]), l); 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) { s48_value scx_Get_Atom_Name(s48_value display, s48_value a) {
char* s; char* s;
s48_value str; s48_value str;
S48_DECLARE_GC_PROTECT_3(display, a, str);
s = XGetAtomName(scx_extract_display(display), s = XGetAtomName(scx_extract_display(display),
scx_extract_atom(a)); scx_extract_atom(a));
str = s48_enter_string(s); str = s48_enter_string(s);
XFree(s); XFree(s);
return str; S48_GC_RETURN(str);
} }
s48_value scx_List_Properties(s48_value display, s48_value window) { s48_value scx_List_Properties(s48_value display, s48_value window) {
int n, i; int n, i;
Atom *atoms; Atom *atoms;
s48_value l = S48_NULL; s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT(1); S48_DECLARE_GC_PROTECT_3(display, window, l);
atoms = XListProperties (scx_extract_display(display), atoms = XListProperties (scx_extract_display(display),
scx_extract_window(window), &n); scx_extract_window(window), &n);
S48_GC_PROTECT_1(l);
for (i = n-1; i >= 0; i--) for (i = n-1; i >= 0; i--)
l = s48_cons(scx_enter_atom(atoms[i]), l); l = s48_cons(scx_enter_atom(atoms[i]), l);
S48_GC_UNPROTECT();
XFree ((char*)atoms); XFree ((char*)atoms);
return l; S48_GC_RETURN(l);
} }
s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window, s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window,
s48_value properties, s48_value delta) { s48_value properties, s48_value delta) {
int i, n = s48_list_length(properties); int i, n = s48_list_length(properties);
Atom p[n]; Atom p[n];
S48_DECLARE_GC_PROTECT_4(display, window, properties, delta);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
p[i] = scx_extract_atom(S48_CAR(properties)); p[i] = scx_extract_atom(S48_CAR(properties));
properties = S48_CDR(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), XRotateWindowProperties(scx_extract_display(display),
scx_extract_window(window), scx_extract_window(window),
p, n, s48_extract_integer(delta)); 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 scx_Delete_Property(s48_value display, s48_value window,
s48_value prop) { s48_value prop) {
S48_DECLARE_GC_PROTECT_3(display, window, prop);
XDeleteProperty(scx_extract_display(display), scx_extract_window(window), XDeleteProperty(scx_extract_display(display), scx_extract_window(window),
scx_extract_atom(prop)); scx_extract_atom(prop));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_property_binding = S48_FALSE; 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) { char** data, int* nelements) {
int i; int i;
s48_value d = S48_RECORD_REF(p, 2); s48_value d = S48_RECORD_REF(p, 2);
S48_DECLARE_GC_PROTECT_2(p, d);
s48_check_record_type(p, scx_property_binding); s48_check_record_type(p, scx_property_binding);
*type = scx_extract_atom(S48_RECORD_REF(p, 0)); *type = scx_extract_atom(S48_RECORD_REF(p, 0));
*format = S48_EXTRACT_ENUM(S48_RECORD_REF(p, 1), *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; break;
} }
S48_GC_UNPROTECT();
} }
s48_value scx_enter_property(Atom type, int format, char* data, 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; int format, i;
unsigned long nitems, bytes_left; unsigned long nitems, bytes_left;
unsigned char* data = NULL; 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), if (XGetWindowProperty (scx_extract_display(display),
scx_extract_window(window), scx_extract_window(window),
scx_extract_atom(atom), 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), scx_extract_atom(req_type),
&actual_type, &format, &nitems, &actual_type, &format, &nitems,
&bytes_left, &data) == Success) { &bytes_left, &data) == Success) {
s48_value p = scx_enter_property(actual_type, format, data, nitems); p = scx_enter_property(actual_type, format, data, nitems);
s48_value res = S48_NULL;
S48_DECLARE_GC_PROTECT(1);
XFree(data); XFree(data);
S48_GC_PROTECT_1(p);
res = s48_cons(s48_enter_integer(bytes_left), p); res = s48_cons(s48_enter_integer(bytes_left), p);
S48_GC_UNPROTECT(); S48_GC_RETURN(res);
return res;
} else } else
/* Property does not exists */ /* Property does not exists */
return S48_FALSE; S48_GC_RETURN(S48_FALSE);
} }
s48_value scx_change_property_mode_binding = 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; Atom type;
int format, nelements; int format, nelements;
char* data; char* data;
S48_DECLARE_GC_PROTECT_5(display, window, atom, mode, property);
scx_extract_property(property, &type, &format, &data, &nelements); 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), scx_extract_change_property_mode(mode),
data, nelements); data, nelements);
free(data); free(data);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection, s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection,
s48_value owner, s48_value time) { s48_value owner, s48_value time) {
S48_DECLARE_GC_PROTECT_4(display, selection, owner, time);
XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection), XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection),
scx_extract_window(owner), scx_extract_time(time)); 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) { s48_value scx_Get_Selection_Owner(s48_value display, s48_value selection) {
return scx_enter_window(XGetSelectionOwner(scx_extract_display(display), Window w;
scx_extract_atom(selection))); 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 scx_Convert_Selection(s48_value display, s48_value selection,
s48_value target, s48_value property, s48_value target, s48_value property,
s48_value requestor, s48_value time) { 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), XConvertSelection(scx_extract_display(display), scx_extract_atom(selection),
scx_extract_atom(target), scx_extract_atom(property), scx_extract_atom(target), scx_extract_atom(property),
scx_extract_window(requestor), scx_extract_time(time)); scx_extract_window(requestor), scx_extract_time(time));
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
void scx_init_property(void) { 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 scx_Draw_Image_String(s48_value display, s48_value drawable,
s48_value gc, s48_value x, s48_value y, s48_value gc, s48_value x, s48_value y,
s48_value string) { s48_value string) {
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
XDrawImageString(scx_extract_display(display), XDrawImageString(scx_extract_display(display),
scx_extract_drawable(drawable), scx_extract_drawable(drawable),
scx_extract_gc(gc), 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_integer(y),
s48_extract_string(string), s48_extract_string(string),
S48_STRING_LENGTH(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, 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) { s48_value string) {
int i, len = s48_list_length(string); int i, len = s48_list_length(string);
XChar2b chars[len]; XChar2b chars[len];
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, string);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string))); chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
chars[i].byte2 = s48_extract_char(S48_CDR(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(x),
s48_extract_integer(y), s48_extract_integer(y),
chars, len); chars, len);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_text_item = S48_FALSE; s48_value scx_text_item = S48_FALSE;
void scx_extract_text_item(s48_value v, XTextItem* ti) { void scx_extract_text_item(s48_value v, XTextItem* ti) {
S48_DECLARE_GC_PROTECT_1(v);
s48_check_record_type(v, scx_text_item); s48_check_record_type(v, scx_text_item);
if (S48_RECORD_REF(v, 0) != S48_FALSE) { if (S48_RECORD_REF(v, 0) != S48_FALSE) {
ti->nchars = S48_STRING_LENGTH(S48_RECORD_REF(v, 0)); 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->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
ti->font = scx_extract_font(S48_RECORD_REF(v, 2)); ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
S48_GC_UNPROTECT();
/* Free all chars arrays! */ /* Free all chars arrays! */
} }
void scx_extract_text_item_16(s48_value v, XTextItem16* ti) { 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); s48_check_record_type(v, scx_text_item);
{ {
if (S48_RECORD_REF(v, 0) != S48_FALSE) { if (S48_RECORD_REF(v, 0) != S48_FALSE) {
s48_value l = S48_RECORD_REF(v, 0); int i, n;
int i, n = s48_list_length(l); l = S48_RECORD_REF(v, 0);
n = s48_list_length(l);
XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b)); XChar2b* s = (XChar2b*)malloc(n * sizeof(XChar2b));
for (i = n-1; i >= 0; i--) { for (i = n-1; i >= 0; i--) {
ti->chars[i].byte1 = s48_extract_integer(S48_CAR(S48_CAR(l))); 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->delta = s48_extract_integer(S48_RECORD_REF(v, 1));
ti->font = scx_extract_font(S48_RECORD_REF(v, 2)); ti->font = scx_extract_font(S48_RECORD_REF(v, 2));
} }
S48_GC_UNPROTECT();
/* Free all chars arrays! */ /* Free all chars arrays! */
} }
@ -78,6 +86,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
s48_value items) { s48_value items) {
int i, len = s48_list_length(items); int i, len = s48_list_length(items);
XTextItem parts[len]; XTextItem parts[len];
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
scx_extract_text_item(S48_CAR(items), &parts[i]); scx_extract_text_item(S48_CAR(items), &parts[i]);
items = S48_CDR(items); items = S48_CDR(items);
@ -90,7 +99,7 @@ s48_value scx_Draw_Text(s48_value display, s48_value drawable,
parts, len); parts, len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
free(parts[i].chars); free(parts[i].chars);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Draw_Text_16(s48_value display, s48_value drawable, 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) { s48_value items) {
int i, len = s48_list_length(items); int i, len = s48_list_length(items);
XTextItem16 parts[len]; XTextItem16 parts[len];
S48_DECLARE_GC_PROTECT_6(display, drawable, gc, x, y, items);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
scx_extract_text_item_16(S48_CAR(items), &parts[i]); scx_extract_text_item_16(S48_CAR(items), &parts[i]);
items = S48_CDR(items); items = S48_CDR(items);
@ -110,18 +120,19 @@ s48_value scx_Draw_Text_16(s48_value display, s48_value drawable,
parts, len); parts, len);
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
free(parts[i].chars); free(parts[i].chars);
return S48_UNSPECIFIC; S48_GC_RETURN(S48_UNSPECIFIC);
} }
s48_value scx_Text_Extents(s48_value font_struct, s48_value string) { s48_value scx_Text_Extents(s48_value font_struct, s48_value string) {
XCharStruct overall; XCharStruct overall;
int dir, ascent, descent; int dir, ascent, descent;
S48_DECLARE_GC_PROTECT_2(font_struct, string);
XTextExtents(scx_extract_fontstruct(font_struct), XTextExtents(scx_extract_fontstruct(font_struct),
s48_extract_string(string), s48_extract_string(string),
S48_STRING_LENGTH(string), S48_STRING_LENGTH(string),
&dir, &ascent, &descent, &dir, &ascent, &descent,
&overall); &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) { 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 dir, ascent, descent;
int i, len = s48_list_length(string); int i, len = s48_list_length(string);
XChar2b chars[len]; XChar2b chars[len];
S48_DECLARE_GC_PROTECT_2(font_struct, string);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string))); chars[i].byte1 = s48_extract_char(S48_CAR(S48_CAR(string)));
chars[i].byte2 = s48_extract_char(S48_CDR(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, chars, len,
&dir, &ascent, &descent, &dir, &ascent, &descent,
&overall); &overall);
return scx_enter_charstruct(&overall); S48_GC_RETURN(scx_enter_charstruct(&overall));
} }
void scx_init_text(void) { 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; s48_value scx_enum_set_type_binding = S48_FALSE;
extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) { extern unsigned long s48_extract_enum_set(s48_value v, s48_value type) {
s48_value enum_set_type = scx_enum_set_type_binding; S48_DECLARE_GC_PROTECT_2(v, type);
s48_check_record_type(v, enum_set_type); s48_check_record_type(v, scx_enum_set_type_binding);
if (S48_UNSAFE_SHARED_BINDING_REF(type) != if (S48_UNSAFE_SHARED_BINDING_REF(type) !=
S48_UNSAFE_RECORD_REF(v, 0)) S48_UNSAFE_RECORD_REF(v, 0))
s48_raise_argument_type_error(v); 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) { 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_value scx_struct_cache_ref(void* cpointer, s48_value list) {
S48_DECLARE_GC_PROTECT_1(list);
while (list != S48_NULL) { while (list != S48_NULL) {
if (S48_EXTRACT_POINTER(S48_CAR(S48_CAR(list))) == cpointer) 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); 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) { void scx_struct_cache_set(void* cpointer, s48_value* l, s48_value v) {
s48_value list = *l; s48_value list = *l;
s48_value previous = S48_FALSE; s48_value previous = S48_FALSE;
s48_value pair = S48_FALSE; s48_value pair = S48_FALSE;
S48_DECLARE_GC_PROTECT(3); S48_DECLARE_GC_PROTECT(4);
S48_GC_PROTECT_3(list, pair, previous); S48_GC_PROTECT_4(v, list, pair, previous);
/* create the new entry */ /* create the new entry */
pair = s48_make_weak_pointer(v); 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 scx_Get_Default(s48_value dpy, s48_value program,
s48_value option) { s48_value option) {
char* ret; char* ret;
S48_DECLARE_GC_PROTECT_3(dpy, program, option);
if (ret = XGetDefault(scx_extract_display(dpy), if (ret = XGetDefault(scx_extract_display(dpy),
s48_extract_string(program), s48_extract_string(program),
s48_extract_string(option))) s48_extract_string(option)))
return s48_enter_string(ret); S48_GC_RETURN(s48_enter_string(ret));
else return S48_FALSE; else S48_GC_RETURN(S48_FALSE);
} }
s48_value scx_Resource_Manager_String(s48_value dpy) { s48_value scx_Resource_Manager_String(s48_value dpy) {
@ -21,13 +22,12 @@ s48_value scx_Parse_Geometry(s48_value strg) {
s48_value ret; s48_value ret;
int x, y, res; int x, y, res;
unsigned int w, h; 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); res = XParseGeometry (s48_extract_string(strg), &x, &y, &w, &h);
ret = s48_make_vector(6, S48_FALSE); ret = s48_make_vector(6, S48_FALSE);
S48_GC_PROTECT_1(ret);
if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE); if (res & XNegative) S48_VECTOR_SET(ret, 0, S48_TRUE);
if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE); if (res & YNegative) S48_VECTOR_SET(ret, 1, S48_TRUE);
if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x)); if (res & XValue) S48_VECTOR_SET(ret, 2, s48_enter_integer(x));