diff --git a/src/h1/xsk/compiler.cpp b/src/h1/xsk/compiler.cpp index cf5b1601..7246c4a0 100644 --- a/src/h1/xsk/compiler.cpp +++ b/src/h1/xsk/compiler.cpp @@ -411,6 +411,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -460,6 +466,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -529,6 +542,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1475,7 +1494,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1494,8 +1512,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break; diff --git a/src/h2/xsk/compiler.cpp b/src/h2/xsk/compiler.cpp index 8f8ce90f..61fe9f67 100644 --- a/src/h2/xsk/compiler.cpp +++ b/src/h2/xsk/compiler.cpp @@ -411,6 +411,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -460,6 +466,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -529,6 +542,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1475,7 +1494,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1494,8 +1512,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break; diff --git a/src/iw5/xsk/compiler.cpp b/src/iw5/xsk/compiler.cpp index 444edca8..3f4448c4 100644 --- a/src/iw5/xsk/compiler.cpp +++ b/src/iw5/xsk/compiler.cpp @@ -405,6 +405,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -454,6 +460,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -523,6 +536,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1469,7 +1488,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1488,8 +1506,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break; diff --git a/src/iw6/xsk/compiler.cpp b/src/iw6/xsk/compiler.cpp index 56bf5acf..abd159ed 100644 --- a/src/iw6/xsk/compiler.cpp +++ b/src/iw6/xsk/compiler.cpp @@ -405,6 +405,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -454,6 +460,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -523,6 +536,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1469,7 +1488,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1488,8 +1506,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break; diff --git a/src/iw7/xsk/compiler.cpp b/src/iw7/xsk/compiler.cpp index 13f4f866..ea2213c0 100644 --- a/src/iw7/xsk/compiler.cpp +++ b/src/iw7/xsk/compiler.cpp @@ -405,6 +405,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -454,6 +460,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -523,6 +536,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1469,7 +1488,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1488,8 +1506,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break; diff --git a/src/s1/xsk/compiler.cpp b/src/s1/xsk/compiler.cpp index 9bf13f23..11716032 100644 --- a/src/s1/xsk/compiler.cpp +++ b/src/s1/xsk/compiler.cpp @@ -411,6 +411,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -460,6 +466,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -529,6 +542,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1475,7 +1494,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1494,8 +1512,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break; diff --git a/src/s2/xsk/compiler.cpp b/src/s2/xsk/compiler.cpp index 4ac46583..a39985d6 100644 --- a/src/s2/xsk/compiler.cpp +++ b/src/s2/xsk/compiler.cpp @@ -411,6 +411,12 @@ void compiler::emit_stmt_while(const gsc::context_ptr& ctx, const gsc::stmt_whil ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + auto begin_loc = insert_label(); bool const_cond = is_constant_condition(stmt->expr); @@ -460,6 +466,13 @@ void compiler::emit_stmt_for(const gsc::context_ptr& ctx, const gsc::stmt_for_pt emit_create_local_vars(stmt->ctx); ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -529,6 +542,12 @@ void compiler::emit_stmt_foreach(const gsc::context_ptr& ctx, const gsc::stmt_fo ctx->local_vars_create_count = stmt->ctx->local_vars_create_count; + for(auto i = 0; i < ctx->local_vars_create_count; i++) + { + if(!ctx->local_vars.at(i).init) + ctx->local_vars.at(i).init = true; + } + ctx->transfer(stmt->ctx_post); auto begin_loc = insert_label(); @@ -1475,7 +1494,6 @@ void compiler::emit_remove_local_vars(const gsc::context_ptr& ctx) void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& expr) { - // need revision used for clear variable switch(expr.as_node->type) { case gsc::node_t::data_level: @@ -1494,8 +1512,14 @@ void compiler::emit_object(const gsc::context_ptr& ctx, const gsc::expr_ptr& exp emit_expr_call(ctx, expr.as_call); emit_opcode(ctx, opcode::OP_CastFieldObject); break; - // array ? - // field ? + case gsc::node_t::expr_array: + emit_array_variable(ctx, expr.as_array); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; + case gsc::node_t::expr_field: + emit_field_variable(ctx, expr.as_field); + emit_opcode(ctx, opcode::OP_CastFieldObject); + break; default: throw gsc::comp_error(expr.as_node->loc, "unknown object type"); break;