fix to 64-bit problems and let-values optimization (PRs 8748 and 8744)
svn: r6668
This commit is contained in:
parent
a87cf03005
commit
441c509549
|
@ -438,6 +438,10 @@
|
|||
(+ x y))
|
||||
3)
|
||||
|
||||
(test-comp '(let-values ([() (values)])
|
||||
5)
|
||||
5)
|
||||
|
||||
(test-comp '(letrec ([x 3]
|
||||
[f (lambda (y) x)])
|
||||
f)
|
||||
|
|
|
@ -423,14 +423,22 @@ static Scheme_Object *foreign_ffi_obj_name(int argc, Scheme_Object *argv[])
|
|||
* mzscheme's fixnums are longs. */
|
||||
inline int scheme_get_realint_val(Scheme_Object *o, int *v)
|
||||
{
|
||||
if (SCHEME_INTP(o)) { *v = (int)(SCHEME_INT_VAL(o)); return 1; }
|
||||
else return 0;
|
||||
if (SCHEME_INTP(o)) {
|
||||
unsigned long lv = SCHEME_INT_VAL(o);
|
||||
int i = (int)lv;
|
||||
if (i != lv)
|
||||
return 0;
|
||||
*v = i;
|
||||
return 1;
|
||||
} else return 0;
|
||||
}
|
||||
inline int scheme_get_unsigned_realint_val(Scheme_Object *o, unsigned int *v)
|
||||
{
|
||||
if (SCHEME_INTP(o)) {
|
||||
int i = (int)(SCHEME_INT_VAL(o));
|
||||
if (i < 0) return 0;
|
||||
unsigned long lv = SCHEME_INT_VAL(o);
|
||||
unsigned int i = (unsigned int)lv;
|
||||
if (i != lv)
|
||||
return 0;
|
||||
*v = i;
|
||||
return 1;
|
||||
} else return 0;
|
||||
|
|
|
@ -354,14 +354,22 @@ static Scheme_Hash_Table *opened_libs;
|
|||
* mzscheme's fixnums are longs. */
|
||||
inline int scheme_get_realint_val(Scheme_Object *o, int *v)
|
||||
{
|
||||
if (SCHEME_INTP(o)) { *v = (int)(SCHEME_INT_VAL(o)); return 1; }
|
||||
else return 0;
|
||||
if (SCHEME_INTP(o)) {
|
||||
unsigned long lv = SCHEME_INT_VAL(o);
|
||||
int i = (int)lv;
|
||||
if (i != lv)
|
||||
return 0;
|
||||
*v = i;
|
||||
return 1;
|
||||
} else return 0;
|
||||
}
|
||||
inline int scheme_get_unsigned_realint_val(Scheme_Object *o, unsigned int *v)
|
||||
{
|
||||
if (SCHEME_INTP(o)) {
|
||||
int i = (int)(SCHEME_INT_VAL(o));
|
||||
if (i < 0) return 0;
|
||||
unsigned long lv = SCHEME_INT_VAL(o);
|
||||
unsigned int i = (unsigned int)lv;
|
||||
if (i != lv)
|
||||
return 0;
|
||||
*v = i;
|
||||
return 1;
|
||||
} else return 0;
|
||||
|
|
|
@ -2794,11 +2794,19 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline)
|
|||
head->body = (Scheme_Object *)naya;
|
||||
head->num_clauses += (pre_body->count - 1);
|
||||
i += (pre_body->count - 1);
|
||||
pre_body = naya;
|
||||
body = (Scheme_Object *)naya;
|
||||
value = pre_body->value;
|
||||
if (pre_body->count) {
|
||||
pre_body = naya;
|
||||
body = (Scheme_Object *)naya;
|
||||
value = pre_body->value;
|
||||
} else {
|
||||
/* We've dropped this clause entirely. */
|
||||
if (i > 0)
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ((pre_body->count == 1)
|
||||
&& !(pre_body->flags[0] & SCHEME_WAS_SET_BANGED)) {
|
||||
|
||||
|
@ -2952,6 +2960,10 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline)
|
|||
|
||||
scheme_optimize_info_done(body_info);
|
||||
|
||||
/* Optimized away all clauses? */
|
||||
if (!head->num_clauses)
|
||||
return head->body;
|
||||
|
||||
if (is_rec && !not_simply_let_star) {
|
||||
/* We can simplify letrec to let* */
|
||||
SCHEME_LET_FLAGS(head) -= SCHEME_LET_RECURSIVE;
|
||||
|
|
|
@ -149,11 +149,11 @@ extern "C" void *scheme_current_process;
|
|||
|
||||
/* Copied off a newsgroup somewhere: */
|
||||
typedef struct {
|
||||
int flags;
|
||||
int functions;
|
||||
int decorations;
|
||||
int inputMode;
|
||||
int unknown;
|
||||
long flags;
|
||||
long functions;
|
||||
long decorations;
|
||||
long inputMode;
|
||||
long unknown;
|
||||
} wxMWM_Hints;
|
||||
|
||||
/* bit definitions for MwmHints.decorations */
|
||||
|
@ -291,7 +291,7 @@ Bool wxFrame::Create(wxFrame *frame_parent, char *title,
|
|||
|
||||
XChangeProperty(display, window, WM_HINTS, WM_HINTS, 32,
|
||||
PropModeReplace, (unsigned char *)&MWMHints,
|
||||
sizeof(MWMHints)/4);
|
||||
sizeof(MWMHints)/sizeof(long));
|
||||
}
|
||||
/* Now try to set KWM hints */
|
||||
if (_style & wxNO_CAPTION) {
|
||||
|
@ -304,7 +304,7 @@ Bool wxFrame::Create(wxFrame *frame_parent, char *title,
|
|||
|
||||
XChangeProperty(display, window, WM_HINTS, WM_HINTS, 32,
|
||||
PropModeReplace, (unsigned char *)&KWMHints,
|
||||
sizeof(KWMHints)/4);
|
||||
sizeof(KWMHints)/sizeof(long));
|
||||
}
|
||||
}
|
||||
/* Now try to set GNOME hints */
|
||||
|
@ -316,7 +316,7 @@ Bool wxFrame::Create(wxFrame *frame_parent, char *title,
|
|||
|
||||
XChangeProperty(display, window, WM_HINTS, XA_CARDINAL, 32,
|
||||
PropModeReplace, (unsigned char *)&GNOMEHints,
|
||||
sizeof(GNOMEHints)/4);
|
||||
sizeof(GNOMEHints)/sizeof(long));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user