fix to 64-bit problems and let-values optimization (PRs 8748 and 8744)

svn: r6668
This commit is contained in:
Matthew Flatt 2007-06-15 22:54:56 +00:00
parent a87cf03005
commit 441c509549
5 changed files with 52 additions and 20 deletions

View File

@ -438,6 +438,10 @@
(+ x y))
3)
(test-comp '(let-values ([() (values)])
5)
5)
(test-comp '(letrec ([x 3]
[f (lambda (y) x)])
f)

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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));
}
}
}