jscript: Use bytecode for void expression.

This commit is contained in:
Jacek Caban 2011-11-24 14:24:45 +01:00 committed by Alexandre Julliard
parent 83667e74d6
commit 0b50c32c83
4 changed files with 10 additions and 21 deletions

View File

@ -225,6 +225,8 @@ static HRESULT compile_expression(compiler_ctx_t *ctx, expression_t *expr)
return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_tonum); return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_tonum);
case EXPR_THIS: case EXPR_THIS:
return push_instr(ctx, OP_this) == -1 ? E_OUTOFMEMORY : S_OK; return push_instr(ctx, OP_this) == -1 ? E_OUTOFMEMORY : S_OK;
case EXPR_VOID:
return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_void);
default: default:
assert(expr->eval != compiled_expression_eval); assert(expr->eval != compiled_expression_eval);
return compile_interp_fallback(ctx, expr); return compile_interp_fallback(ctx, expr);

View File

@ -2459,29 +2459,16 @@ HRESULT delete_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD fla
} }
/* ECMA-262 3rd Edition 11.4.2 */ /* ECMA-262 3rd Edition 11.4.2 */
HRESULT void_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) HRESULT interp_void(exec_ctx_t *ctx)
{ {
unary_expression_t *expr = (unary_expression_t*)_expr; VARIANT v;
exprval_t exprval;
VARIANT tmp;
HRESULT hres;
TRACE("\n"); TRACE("\n");
hres = expr_eval(ctx, expr->expression, 0, ei, &exprval); stack_popn(ctx, 1);
if(FAILED(hres))
return hres;
hres = exprval_to_value(ctx, &exprval, ei, &tmp); V_VT(&v) = VT_EMPTY;
exprval_release(&exprval); return stack_push(ctx, &v);
if(FAILED(hres))
return hres;
VariantClear(&tmp);
ret->type = EXPRVAL_VARIANT;
V_VT(&ret->u.var) = VT_EMPTY;
return S_OK;
} }
/* ECMA-262 3rd Edition 11.4.3 */ /* ECMA-262 3rd Edition 11.4.3 */

View File

@ -57,7 +57,8 @@ typedef struct _func_stack {
X(this, 1, 0,0) \ X(this, 1, 0,0) \
X(tonum, 1, 0,0) \ X(tonum, 1, 0,0) \
X(tree, 1, ARG_EXPR, 0) \ X(tree, 1, ARG_EXPR, 0) \
X(ret, 0, 0,0) X(ret, 0, 0,0) \
X(void, 1, 0,0)
typedef enum { typedef enum {
#define X(x,a,b,c) OP_##x, #define X(x,a,b,c) OP_##x,
@ -545,7 +546,6 @@ HRESULT mul_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprva
HRESULT div_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT div_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
HRESULT mod_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT mod_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
HRESULT delete_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT delete_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
HRESULT void_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
HRESULT typeof_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT typeof_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
HRESULT minus_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT minus_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
HRESULT post_increment_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN; HRESULT post_increment_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;

View File

@ -1319,7 +1319,7 @@ static const expression_eval_t expression_eval_table[] = {
div_expression_eval, div_expression_eval,
mod_expression_eval, mod_expression_eval,
delete_expression_eval, delete_expression_eval,
void_expression_eval, compiled_expression_eval,
typeof_expression_eval, typeof_expression_eval,
minus_expression_eval, minus_expression_eval,
compiled_expression_eval, compiled_expression_eval,