mirror of
https://github.com/reactos/reactos.git
synced 2025-02-21 16:04:57 +00:00
[VBSCRIPT] Sync with Wine Staging 1.7.37. CORE-9246
svn path=/trunk/; revision=67402
This commit is contained in:
parent
5ddcd5ea52
commit
1a597e49f1
8 changed files with 763 additions and 649 deletions
|
@ -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:
|
||||
|
|
|
@ -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(<);
|
||||
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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
@ -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 */
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue