[VBSCRIPT] Sync with Wine Staging 1.7.37. CORE-9246

svn path=/trunk/; revision=67402
This commit is contained in:
Amine Khaldi 2015-04-25 11:03:05 +00:00
parent 5ddcd5ea52
commit 1a597e49f1
8 changed files with 763 additions and 649 deletions

View file

@ -515,6 +515,8 @@ static HRESULT compile_expression(compile_ctx_t *ctx, expression_t *expr)
return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_nequal);
case EXPR_NEW:
return push_instr_str(ctx, OP_new, ((string_expression_t*)expr)->value);
case EXPR_NOARG:
return push_instr_int(ctx, OP_hres, DISP_E_PARAMNOTFOUND);
case EXPR_NOT:
return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_not);
case EXPR_NOTHING:

View file

@ -19,6 +19,7 @@
#include "vbscript.h"
#include <math.h>
#include <wingdi.h>
#include <mshtmhst.h>
#define round(x) (((x) < 0) ? (int)((x) - 0.5) : (int)((x) + 0.5))
@ -106,9 +107,6 @@ static HRESULT return_short(VARIANT *res, short val)
static HRESULT return_int(VARIANT *res, int val)
{
if((short)val == val)
return return_short(res, val);
if(res) {
V_VT(res) = VT_I4;
V_I4(res) = val;
@ -127,6 +125,16 @@ static inline HRESULT return_double(VARIANT *res, double val)
return S_OK;
}
static inline HRESULT return_float(VARIANT *res, float val)
{
if(res) {
V_VT(res) = VT_R4;
V_R4(res) = val;
}
return S_OK;
}
static inline HRESULT return_null(VARIANT *res)
{
if(res)
@ -196,11 +204,12 @@ static HRESULT set_object_site(script_ctx_t *ctx, IUnknown *obj)
return S_OK;
ax_site = create_ax_site(ctx);
if(ax_site)
if(ax_site) {
hres = IObjectWithSite_SetSite(obj_site, ax_site);
IUnknown_Release(ax_site);
}
else
hres = E_OUTOFMEMORY;
IUnknown_Release(ax_site);
IObjectWithSite_Release(obj_site);
return hres;
}
@ -411,9 +420,7 @@ static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARI
if(!res)
return DISP_E_BADVARTYPE;
V_VT(res) = VT_I4;
V_I4(res) = i;
return S_OK;
return return_int(res, i);
}
static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@ -759,8 +766,13 @@ static HRESULT Global_Rnd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIA
static HRESULT Global_Timer(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{
FIXME("\n");
return E_NOTIMPL;
SYSTEMTIME lt;
double sec;
GetLocalTime(&lt);
sec = lt.wHour * 3600 + lt.wMinute * 60 + lt.wSecond + lt.wMilliseconds / 1000.0;
return return_float(res, sec);
}
static HRESULT Global_LBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@ -777,8 +789,24 @@ static HRESULT Global_UBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA
static HRESULT Global_RGB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
{
FIXME("\n");
return E_NOTIMPL;
HRESULT hres;
int i, color[3];
TRACE("%s %s %s\n", debugstr_variant(arg), debugstr_variant(arg + 1), debugstr_variant(arg + 2));
assert(args_cnt == 3);
for(i = 0; i < 3; i++) {
hres = to_int(arg + i, color + i);
if(FAILED(hres))
return hres;
if(color[i] > 255)
color[i] = 255;
if(color[i] < 0)
return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL);
}
return return_int(res, RGB(color[0], color[1], color[2]));
}
static HRESULT Global_Len(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@ -1745,10 +1773,64 @@ static HRESULT Global_StrReverse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt
return return_bstr(res, ret);
}
static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
{
FIXME("\n");
return E_NOTIMPL;
int start, ret = 0;
BSTR str1, str2;
HRESULT hres;
TRACE("%s %s arg_cnt=%u\n", debugstr_variant(args), debugstr_variant(args+1), args_cnt);
if(args_cnt > 3) {
FIXME("Unsupported args\n");
return E_NOTIMPL;
}
assert(2 <= args_cnt && args_cnt <= 4);
if(V_VT(args) == VT_NULL || V_VT(args+1) == VT_NULL || V_VT(args+2) == VT_NULL)
return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
hres = to_string(args, &str1);
if(FAILED(hres))
return hres;
hres = to_string(args+1, &str2);
if(SUCCEEDED(hres)) {
if(args_cnt > 2) {
hres = to_int(args+2, &start);
if(SUCCEEDED(hres) && start <= 0) {
FIXME("Unsupported start %d\n", start);
hres = E_NOTIMPL;
}
}else {
start = SysStringLen(str1);
}
} else {
str2 = NULL;
}
if(SUCCEEDED(hres)) {
const WCHAR *ptr;
size_t len;
len = SysStringLen(str2);
if(start >= len && start <= SysStringLen(str1)) {
for(ptr = str1+start-SysStringLen(str2); ptr >= str1; ptr--) {
if(!memcmp(ptr, str2, len*sizeof(WCHAR))) {
ret = ptr-str1+1;
break;
}
}
}
}
SysFreeString(str1);
SysFreeString(str2);
if(FAILED(hres))
return hres;
return return_int(res, ret);
}
static HRESULT Global_LoadPicture(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@ -1772,12 +1854,7 @@ static HRESULT Global_ScriptEngineMajorVersion(vbdisp_t *This, VARIANT *arg, uns
assert(args_cnt == 0);
if(res) {
V_VT(res) = VT_I4;
V_I4(res) = VBSCRIPT_MAJOR_VERSION;
}
return S_OK;
return return_int(res, VBSCRIPT_MAJOR_VERSION);
}
static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@ -1786,12 +1863,7 @@ static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, uns
assert(args_cnt == 0);
if(res) {
V_VT(res) = VT_I4;
V_I4(res) = VBSCRIPT_MINOR_VERSION;
}
return S_OK;
return return_int(res, VBSCRIPT_MINOR_VERSION);
}
static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
@ -1800,12 +1872,7 @@ static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, uns
assert(args_cnt == 0);
if(res) {
V_VT(res) = VT_I4;
V_I4(res) = VBSCRIPT_BUILD_VERSION;
}
return S_OK;
return return_int(res, VBSCRIPT_BUILD_VERSION);
}
static HRESULT Global_FormatNumber(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)

View file

@ -1360,6 +1360,18 @@ static HRESULT interp_nothing(exec_ctx_t *ctx)
return stack_push(ctx, &v);
}
static HRESULT interp_hres(exec_ctx_t *ctx)
{
const unsigned arg = ctx->instr->arg1.uint;
VARIANT v;
TRACE("%d\n", arg);
V_VT(&v) = VT_ERROR;
V_ERROR(&v) = arg;
return stack_push(ctx, &v);
}
static HRESULT interp_not(exec_ctx_t *ctx)
{
variant_val_t val;

View file

@ -42,6 +42,7 @@ typedef enum {
EXPR_NEG,
EXPR_NEQUAL,
EXPR_NEW,
EXPR_NOARG, /* not a real expression */
EXPR_NOT,
EXPR_NOTHING,
EXPR_NULL,

File diff suppressed because it is too large Load diff

View file

@ -128,7 +128,7 @@ static const WCHAR propertyW[] = {'p','r','o','p','e','r','t','y',0};
%type <expression> NotExpression UnaryExpression AndExpression OrExpression XorExpression EqvExpression
%type <expression> ConstExpression NumericLiteralExpression
%type <member> MemberExpression
%type <expression> Arguments_opt ArgumentList_opt Step_opt ExpressionList
%type <expression> Arguments_opt ArgumentList ArgumentList_opt Step_opt ExpressionList
%type <boolean> OptionExplicit_opt DoType
%type <arg_decl> ArgumentsDecl_opt ArgumentDeclList ArgumentDecl
%type <func_decl> FunctionDecl PropertyDecl
@ -246,10 +246,10 @@ Step_opt
IfStatement
: tIF Expression tTHEN tNL StatementsNl_opt ElseIfs_opt Else_opt tEND tIF
{ $$ = new_if_statement(ctx, $2, $5, $6, $7); CHECK_ERROR; }
| tIF Expression tTHEN Statement { $$ = new_if_statement(ctx, $2, $4, NULL, NULL); CHECK_ERROR; }
{ $$ = new_if_statement(ctx, $2, $5, $6, $7); CHECK_ERROR; }
| tIF Expression tTHEN Statement EndIf_opt { $$ = new_if_statement(ctx, $2, $4, NULL, NULL); CHECK_ERROR; }
| tIF Expression tTHEN Statement tELSE Statement EndIf_opt
{ $$ = new_if_statement(ctx, $2, $4, NULL, $6); CHECK_ERROR; }
{ $$ = new_if_statement(ctx, $2, $4, NULL, $6); CHECK_ERROR; }
EndIf_opt
: /* empty */
@ -279,11 +279,16 @@ CaseClausules
Arguments_opt
: EmptyBrackets_opt { $$ = NULL; }
| '(' ExpressionList ')' { $$ = $2; }
| '(' ArgumentList ')' { $$ = $2; }
ArgumentList_opt
: EmptyBrackets_opt { $$ = NULL; }
| ExpressionList { $$ = $1; }
| ArgumentList { $$ = $1; }
ArgumentList
: Expression { $$ = $1; }
| Expression ',' ArgumentList { $1->next = $3; $$ = $1; }
| ',' ArgumentList { $$ = new_expression(ctx, EXPR_NOARG, 0); CHECK_ERROR; $$->next = $2; }
EmptyBrackets_opt
: /* empty */

View file

@ -245,6 +245,7 @@ typedef enum {
X(empty, 1, 0, 0) \
X(enumnext, 0, ARG_ADDR, ARG_BSTR) \
X(equal, 1, 0, 0) \
X(hres, 1, ARG_UINT, 0) \
X(errmode, 1, ARG_INT, 0) \
X(eqv, 1, 0, 0) \
X(exp, 1, 0, 0) \

View file

@ -198,7 +198,7 @@ reactos/dll/win32/url # Synced to Wine-1.7.27
reactos/dll/win32/urlmon # Synced to WineStaging-1.7.37
reactos/dll/win32/usp10 # Synced to WineStaging-1.7.37
reactos/dll/win32/uxtheme # Forked
reactos/dll/win32/vbscript # Synced to Wine-1.7.27
reactos/dll/win32/vbscript # Synced to WineStaging-1.7.37
reactos/dll/win32/version # Synced to Wine-1.7.27
reactos/dll/win32/wbemdisp # Synced to Wine-1.7.27
reactos/dll/win32/wbemprox # Synced to WineStaging-1.7.37