vbscript: Moved creating new dynamic variable to separated function.
This commit is contained in:
parent
a968166224
commit
020d0695bb
|
@ -198,6 +198,46 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, vbdisp_invoke_type_
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT add_dynamic_var(exec_ctx_t *ctx, const WCHAR *name, VARIANT *val, BOOL own_val)
|
||||||
|
{
|
||||||
|
dynamic_var_t *new_var;
|
||||||
|
vbsheap_t *heap;
|
||||||
|
WCHAR *str;
|
||||||
|
unsigned size;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
heap = ctx->func->type == FUNC_GLOBAL ? &ctx->script->heap : &ctx->heap;
|
||||||
|
|
||||||
|
new_var = vbsheap_alloc(heap, sizeof(*new_var));
|
||||||
|
if(!new_var)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
size = (strlenW(name)+1)*sizeof(WCHAR);
|
||||||
|
str = vbsheap_alloc(heap, size);
|
||||||
|
if(!str)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
memcpy(str, name, size);
|
||||||
|
new_var->name = str;
|
||||||
|
|
||||||
|
if(own_val) {
|
||||||
|
new_var->v = *val;
|
||||||
|
}else {
|
||||||
|
hres = VariantCopy(&new_var->v, val);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ctx->func->type == FUNC_GLOBAL) {
|
||||||
|
new_var->next = ctx->script->global_vars;
|
||||||
|
ctx->script->global_vars = new_var;
|
||||||
|
}else {
|
||||||
|
new_var->next = ctx->dynamic_vars;
|
||||||
|
ctx->dynamic_vars = new_var;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static inline VARIANT *stack_pop(exec_ctx_t *ctx)
|
static inline VARIANT *stack_pop(exec_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
assert(ctx->top);
|
assert(ctx->top);
|
||||||
|
@ -491,48 +531,14 @@ static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, VARIANT *val, BOOL own_v
|
||||||
case REF_OBJ:
|
case REF_OBJ:
|
||||||
FIXME("REF_OBJ\n");
|
FIXME("REF_OBJ\n");
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
case REF_NONE: {
|
case REF_NONE:
|
||||||
dynamic_var_t *new_var;
|
|
||||||
vbsheap_t *heap;
|
|
||||||
WCHAR *str;
|
|
||||||
unsigned size;
|
|
||||||
|
|
||||||
if(ctx->func->code_ctx->option_explicit) {
|
if(ctx->func->code_ctx->option_explicit) {
|
||||||
FIXME("throw exception\n");
|
FIXME("throw exception\n");
|
||||||
return E_FAIL;
|
hres = E_FAIL;
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("creating variable %s\n", debugstr_w(name));
|
|
||||||
|
|
||||||
heap = ctx->func->type == FUNC_GLOBAL ? &ctx->script->heap : &ctx->heap;
|
|
||||||
|
|
||||||
new_var = vbsheap_alloc(heap, sizeof(*new_var));
|
|
||||||
if(!new_var)
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
size = (strlenW(name)+1)*sizeof(WCHAR);
|
|
||||||
str = vbsheap_alloc(heap, size);
|
|
||||||
if(!str)
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
memcpy(str, name, size);
|
|
||||||
new_var->name = str;
|
|
||||||
|
|
||||||
if(own_val) {
|
|
||||||
new_var->v = *val;
|
|
||||||
}else {
|
}else {
|
||||||
hres = VariantCopy(&new_var->v, val);
|
TRACE("creating variable %s\n", debugstr_w(name));
|
||||||
if(FAILED(hres))
|
hres = add_dynamic_var(ctx, name, val, own_val);
|
||||||
return hres;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ctx->func->type == FUNC_GLOBAL) {
|
|
||||||
new_var->next = ctx->script->global_vars;
|
|
||||||
ctx->script->global_vars = new_var;
|
|
||||||
}else {
|
|
||||||
new_var->next = ctx->dynamic_vars;
|
|
||||||
ctx->dynamic_vars = new_var;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return hres;
|
return hres;
|
||||||
|
|
Loading…
Reference in New Issue