[VBSCRIPT] Sync with Wine Staging 3.9. CORE-14656
[reactos.git] / dll / win32 / vbscript / compile.c
index d61c649..302804f 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include <assert.h>
+
 #include "vbscript.h"
+#include "parse.h"
+#include "parser.tab.h"
+
+#include "wine/debug.h"
 
+WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
 WINE_DECLARE_DEBUG_CHANNEL(vbscript_disas);
 
 typedef struct _statement_ctx_t {
@@ -515,6 +522,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:
@@ -1649,11 +1658,10 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
             return E_OUTOFMEMORY;
 
         class_desc->props[i].is_public = prop_decl->is_public;
+        class_desc->props[i].is_array = prop_decl->is_array;
 
-        if(prop_decl->is_array) {
-            class_desc->props[i].is_array = TRUE;
+        if(prop_decl->is_array)
             class_desc->array_cnt++;
-        }
     }
 
     if(class_desc->array_cnt) {
@@ -1738,6 +1746,8 @@ void release_vbscode(vbscode_t *code)
     for(i=0; i < code->bstr_cnt; i++)
         SysFreeString(code->bstr_pool[i]);
 
+    if(code->context)
+        IDispatch_Release(code->context);
     heap_pool_free(&code->heap);
 
     heap_free(code->bstr_pool);
@@ -1750,7 +1760,7 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source)
 {
     vbscode_t *ret;
 
-    ret = heap_alloc(sizeof(*ret));
+    ret = heap_alloc_zero(sizeof(*ret));
     if(!ret)
         return NULL;
 
@@ -1772,19 +1782,8 @@ static vbscode_t *alloc_vbscode(compile_ctx_t *ctx, const WCHAR *source)
 
     ret->option_explicit = ctx->parser.option_explicit;
 
-    ret->bstr_pool = NULL;
-    ret->bstr_pool_size = 0;
-    ret->bstr_cnt = 0;
-    ret->pending_exec = FALSE;
-
     ret->main_code.type = FUNC_GLOBAL;
-    ret->main_code.name = NULL;
     ret->main_code.code_ctx = ret;
-    ret->main_code.vars = NULL;
-    ret->main_code.var_cnt = 0;
-    ret->main_code.array_cnt = 0;
-    ret->main_code.arg_cnt = 0;
-    ret->main_code.args = NULL;
 
     list_init(&ret->entry);
     return ret;