diff --git a/collects/tests/mzscheme/optimize.ss b/collects/tests/mzscheme/optimize.ss index c58e9dd9bb..9d0d66b53f 100644 --- a/collects/tests/mzscheme/optimize.ss +++ b/collects/tests/mzscheme/optimize.ss @@ -438,6 +438,10 @@ (+ x y)) 3) +(test-comp '(let-values ([() (values)]) + 5) + 5) + (test-comp '(letrec ([x 3] [f (lambda (y) x)]) f) diff --git a/src/foreign/foreign.c b/src/foreign/foreign.c index db3b48af06..bf9112cd58 100644 --- a/src/foreign/foreign.c +++ b/src/foreign/foreign.c @@ -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; diff --git a/src/foreign/foreign.ssc b/src/foreign/foreign.ssc index 9f43618183..d8993ce6be 100755 --- a/src/foreign/foreign.ssc +++ b/src/foreign/foreign.ssc @@ -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; diff --git a/src/mzscheme/src/syntax.c b/src/mzscheme/src/syntax.c index b8e3af1b2e..2926fb85cd 100644 --- a/src/mzscheme/src/syntax.c +++ b/src/mzscheme/src/syntax.c @@ -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; diff --git a/src/wxxt/src/Windows/Frame.cc b/src/wxxt/src/Windows/Frame.cc index a3d63b1ec4..dcaf9a9c07 100644 --- a/src/wxxt/src/Windows/Frame.cc +++ b/src/wxxt/src/Windows/Frame.cc @@ -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)); } } }