jscript: Added function expression implementation.
This commit is contained in:
parent
e4e47c0149
commit
b2a93fe3c3
|
@ -703,10 +703,34 @@ static HRESULT get_binary_expr_values(exec_ctx_t *ctx, binary_expression_t *expr
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
/* ECMA-262 3rd Edition 13 */
|
||||||
|
HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
function_expression_t *expr = (function_expression_t*)_expr;
|
||||||
return E_NOTIMPL;
|
DispatchEx *dispex;
|
||||||
|
VARIANT var;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
TRACE("\n");
|
||||||
|
|
||||||
|
hres = create_source_function(ctx->parser, expr->parameter_list, expr->source_elements, ctx->scope_chain, &dispex);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
V_VT(&var) = VT_DISPATCH;
|
||||||
|
V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(dispex);
|
||||||
|
|
||||||
|
if(expr->identifier) {
|
||||||
|
hres = jsdisp_propput_name(ctx->var_disp, expr->identifier, ctx->parser->script->lcid, &var, ei, NULL/*FIXME*/);
|
||||||
|
if(FAILED(hres)) {
|
||||||
|
jsdisp_release(dispex);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret->type = EXPRVAL_VARIANT;
|
||||||
|
ret->u.var = var;
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT conditional_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
HRESULT conditional_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
|
||||||
|
|
|
@ -81,5 +81,16 @@ ok(testFunc1(true, "test") === true, "testFunc1 not returned true");
|
||||||
|
|
||||||
var obj1 = new Object();
|
var obj1 = new Object();
|
||||||
ok(typeof(obj1) === "object", "typeof(obj1) is not object");
|
ok(typeof(obj1) === "object", "typeof(obj1) is not object");
|
||||||
|
obj1.test = true;
|
||||||
|
obj1.func = function () {
|
||||||
|
ok(this === obj1, "this is not obj1");
|
||||||
|
ok(this.test === true, "this.test is not true");
|
||||||
|
ok(arguments.length === 1, "arguments.length is not 1");
|
||||||
|
ok(arguments["0"] === true, "arguments[0] is not true");
|
||||||
|
|
||||||
|
return "test";
|
||||||
|
};
|
||||||
|
|
||||||
|
ok(obj1.func(true) === "test", "obj1.func(true) is not \"test\"");
|
||||||
|
|
||||||
reportSuccess();
|
reportSuccess();
|
||||||
|
|
Loading…
Reference in New Issue