fixed a lexer bug than returned FPDECLIT where INTLIT was desired.
added more code to process jump labels
This commit is contained in:
parent
1c0b23fa97
commit
d3f1a435cb
@ -91,9 +91,10 @@ class MyObject(Object)
|
|||||||
| tb |
|
| tb |
|
||||||
tb := tc at: idx.
|
tb := tc at: idx.
|
||||||
System log(System.Log.INFO, idx asString, (if (tb value) { " PASS" } else { " FAIL" }), "\n").
|
System log(System.Log.INFO, idx asString, (if (tb value) { " PASS" } else { " FAIL" }), "\n").
|
||||||
/*a:
|
|
||||||
b: c:*/
|
|
||||||
].
|
].
|
||||||
|
(if (true) { a: 10. b: 1p1000. 20000 }) dump.
|
||||||
|
[a: 10. b: 1000. ] value class dump.
|
||||||
|
|
||||||
|
|
||||||
Exception signal: 'experiment with exception signalling'.
|
Exception signal: 'experiment with exception signalling'.
|
||||||
|
|
||||||
|
@ -1549,6 +1549,7 @@ static int get_numlit (moo_t* moo, int negated)
|
|||||||
{
|
{
|
||||||
moo_iolxc_t period;
|
moo_iolxc_t period;
|
||||||
moo_oow_t scale;
|
moo_oow_t scale;
|
||||||
|
moo_iotok_type_t tok_type;
|
||||||
|
|
||||||
fixed_point:
|
fixed_point:
|
||||||
scale = 0;
|
scale = 0;
|
||||||
@ -1563,6 +1564,12 @@ static int get_numlit (moo_t* moo, int negated)
|
|||||||
{
|
{
|
||||||
unget_char (moo, &moo->c->lxc);
|
unget_char (moo, &moo->c->lxc);
|
||||||
unget_char (moo, &period);
|
unget_char (moo, &period);
|
||||||
|
if (xscale <= 0)
|
||||||
|
{
|
||||||
|
/* * restore the token type. it's not prefixed with 'p' like 20p.
|
||||||
|
* the number is followed by a terminating period rather than a decimal point. */
|
||||||
|
SET_TOKEN_TYPE(moo, MOO_IOTOK_INTLIT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4978,6 +4985,8 @@ static int compile_block_expression (moo_t* moo)
|
|||||||
code_start = cc->mth.code.len;
|
code_start = cc->mth.code.len;
|
||||||
if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACK)
|
if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACK)
|
||||||
{
|
{
|
||||||
|
moo_oow_t pop_stacktop_pos = 0;
|
||||||
|
|
||||||
while (TOKEN_TYPE(moo) != MOO_IOTOK_EOF)
|
while (TOKEN_TYPE(moo) != MOO_IOTOK_EOF)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
@ -4987,7 +4996,13 @@ static int compile_block_expression (moo_t* moo)
|
|||||||
if (n == 8888)
|
if (n == 8888)
|
||||||
{
|
{
|
||||||
/* compile_block_statement() processed non-statement item like a jump label. */
|
/* compile_block_statement() processed non-statement item like a jump label. */
|
||||||
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK) break;
|
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK)
|
||||||
|
{
|
||||||
|
/* eliminate BCODE_POP_STACKTOP produced in the else block below
|
||||||
|
* becuase the non-steatemnt item is the last item before the closing bracket */
|
||||||
|
if (pop_stacktop_pos > 0) eliminate_instructions (moo, pop_stacktop_pos, cc->mth.code.len - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4998,6 +5013,8 @@ static int compile_block_expression (moo_t* moo)
|
|||||||
moo_ioloc_t period_loc = *TOKEN_LOC(moo);
|
moo_ioloc_t period_loc = *TOKEN_LOC(moo);
|
||||||
GET_TOKEN (moo);
|
GET_TOKEN (moo);
|
||||||
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK) break;
|
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK) break;
|
||||||
|
|
||||||
|
pop_stacktop_pos = cc->mth.code.len;
|
||||||
if (emit_byte_instruction(moo, BCODE_POP_STACKTOP, &period_loc) <= -1) return -1;
|
if (emit_byte_instruction(moo, BCODE_POP_STACKTOP, &period_loc) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -6052,6 +6069,8 @@ static int compile_braced_block (moo_t* moo)
|
|||||||
code_start = cc->mth.code.len;
|
code_start = cc->mth.code.len;
|
||||||
if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACE)
|
if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACE)
|
||||||
{
|
{
|
||||||
|
moo_oow_t pop_stacktop_pos = 0;
|
||||||
|
|
||||||
while (TOKEN_TYPE(moo) != MOO_IOTOK_EOF)
|
while (TOKEN_TYPE(moo) != MOO_IOTOK_EOF)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
@ -6060,7 +6079,14 @@ static int compile_braced_block (moo_t* moo)
|
|||||||
if (n <= -1) return -1;
|
if (n <= -1) return -1;
|
||||||
if (n == 8888)
|
if (n == 8888)
|
||||||
{
|
{
|
||||||
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE) break;
|
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE)
|
||||||
|
{
|
||||||
|
/* non-statement followed by the closing brace.
|
||||||
|
* if there is a statement above the non-statement item, the POP_STACKSTOP is procuced.
|
||||||
|
* it should be eliminated since the block should return the last evalulated value */
|
||||||
|
if (pop_stacktop_pos > 0) eliminate_instructions (moo, pop_stacktop_pos, cc->mth.code.len - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -6071,6 +6097,8 @@ static int compile_braced_block (moo_t* moo)
|
|||||||
moo_ioloc_t period_loc = *TOKEN_LOC(moo);
|
moo_ioloc_t period_loc = *TOKEN_LOC(moo);
|
||||||
GET_TOKEN (moo);
|
GET_TOKEN (moo);
|
||||||
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE) break;
|
if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE) break;
|
||||||
|
|
||||||
|
pop_stacktop_pos = cc->mth.code.len; /* remember the position of the last POP_STACKTOP for elimination */
|
||||||
if (emit_byte_instruction(moo, BCODE_POP_STACKTOP, &period_loc) <= -1) return -1;
|
if (emit_byte_instruction(moo, BCODE_POP_STACKTOP, &period_loc) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -6537,16 +6565,16 @@ static int compile_method_expression (moo_t* moo, int pop)
|
|||||||
|
|
||||||
if (TOKEN_TYPE(moo) == MOO_IOTOK_IF || TOKEN_TYPE(moo) == MOO_IOTOK_IFNOT)
|
if (TOKEN_TYPE(moo) == MOO_IOTOK_IF || TOKEN_TYPE(moo) == MOO_IOTOK_IFNOT)
|
||||||
{
|
{
|
||||||
if (compile_if_expression (moo) <= -1) return -1;
|
if (compile_if_expression(moo) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else if (TOKEN_TYPE(moo) == MOO_IOTOK_WHILE ||
|
else if (TOKEN_TYPE(moo) == MOO_IOTOK_WHILE ||
|
||||||
TOKEN_TYPE(moo) == MOO_IOTOK_UNTIL)
|
TOKEN_TYPE(moo) == MOO_IOTOK_UNTIL)
|
||||||
{
|
{
|
||||||
if (compile_while_expression (moo) <= -1) return -1;
|
if (compile_while_expression(moo) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else if (TOKEN_TYPE(moo) == MOO_IOTOK_DO)
|
else if (TOKEN_TYPE(moo) == MOO_IOTOK_DO)
|
||||||
{
|
{
|
||||||
if (compile_do_while_expression (moo) <= -1) return -1;
|
if (compile_do_while_expression(moo) <= -1) return -1;
|
||||||
}
|
}
|
||||||
else if (TOKEN_TYPE(moo) == MOO_IOTOK_IDENT ||
|
else if (TOKEN_TYPE(moo) == MOO_IOTOK_IDENT ||
|
||||||
TOKEN_TYPE(moo) == MOO_IOTOK_IDENT_DOTTED)
|
TOKEN_TYPE(moo) == MOO_IOTOK_IDENT_DOTTED)
|
||||||
@ -6735,8 +6763,9 @@ MOO_DEBUG2 (moo, "LABEL => %.*js\n", TOKEN_NAME_LEN(moo), TOKEN_NAME_PTR(moo));
|
|||||||
static int compile_block_statement (moo_t* moo)
|
static int compile_block_statement (moo_t* moo)
|
||||||
{
|
{
|
||||||
/* compile_block_statement() is a simpler version of
|
/* compile_block_statement() is a simpler version of
|
||||||
* of compile_method_statement(). it doesn't cater for
|
* of compile_method_statement(). it doesn't care to
|
||||||
* popping the stack top */
|
* produce the instruction to pop the stack top by passing
|
||||||
|
* 0 as the second argument to compile_method_expression(). */
|
||||||
int n;
|
int n;
|
||||||
n = compile_special_statement(moo);
|
n = compile_special_statement(moo);
|
||||||
if (n <= -1) return -1;
|
if (n <= -1) return -1;
|
||||||
|
@ -68,7 +68,7 @@ moo_oop_t moo_makefpdec (moo_t* moo, moo_oop_t value, moo_ooi_t scale)
|
|||||||
moo_oop_fpdec_t fpdec;
|
moo_oop_fpdec_t fpdec;
|
||||||
|
|
||||||
MOO_ASSERT (moo, moo_isint(moo, value));
|
MOO_ASSERT (moo, moo_isint(moo, value));
|
||||||
if (scale <= 0) return value; /* if scale is 0 or less, return the value as it it */
|
if (scale <= 0) return value; /* if scale is 0 or less, return the value as it is */
|
||||||
|
|
||||||
if (scale > MOO_SMOOI_MAX)
|
if (scale > MOO_SMOOI_MAX)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user