jsonpiler 0.9.3

a Json syntax programming language for Windows
Documentation
pub(crate) mod handler;
mod input;
mod print_n;
mod random;
mod str_utility;
mod wnd_proc;
use crate::prelude::*;
use std::collections::btree_map::Entry;
impl Jsonpiler {
  pub(crate) fn get_critical_section(&mut self) -> LabelId {
    if let Some(id) = self.symbols.get(CRITICAL_SECTION) {
      return *id;
    }
    let initialize_cs = self.import(KERNEL32, "InitializeCriticalSection");
    let critical_section = self.bss(0x28, 8);
    self.startup.extend_from_slice(&[LeaRM(Rcx, Global(critical_section)), CallApi(initialize_cs)]);
    self.symbols.insert(CRITICAL_SECTION, critical_section);
    critical_section
  }
  pub(crate) fn link_function(&mut self, id: LabelId, insts: &[Inst], stack_size: i32) {
    let end = self.id();
    self.link_label(id, insts, stack_size, Some(end), true, true);
  }
  pub(crate) fn link_function_no_seh(&mut self, id: LabelId, insts: &[Inst], stack_size: i32) {
    self.link_label(id, insts, stack_size, None, true, true);
  }
  pub(crate) fn link_label(
    &mut self,
    id: LabelId,
    body: &[Inst],
    stack_size: i32,
    end_opt: Option<LabelId>,
    is_function: bool,
    is_return: bool,
  ) {
    let mut insts = vec![Lbl(id)];
    if is_function {
      insts.extend_from_slice(&[Push(Rbp), mov_q(Rbp, Rsp), SubRId(Rsp, stack_size)]);
    }
    insts.extend_from_slice(body);
    if let Some(end) = end_opt {
      if is_return {
        if is_function {
          insts.extend_from_slice(&[AddRId(Rsp, stack_size), Pop(Rbp), Custom(RET)]);
        }
      } else {
        insts.push(CallApi(self.import(KERNEL32, "ExitProcess")));
      }
      insts.push(Lbl(end));
    }
    match self.functions.entry(id) {
      Entry::Occupied(mut entry) => {
        entry.get_mut().insts = insts;
        entry.get_mut().seh = end_opt.map(|end| (end, stack_size));
      }
      Entry::Vacant(entry) => {
        entry.insert(CompiledFunc {
          insts,
          dep: Dependency { id, uses: vec![] },
          seh: end_opt.map(|end| (end, stack_size)),
        });
      }
    }
  }
  pub(crate) fn link_not_return(&mut self, id: LabelId, insts: &[Inst], stack_size: i32) {
    let end = self.id();
    self.link_label(id, insts, stack_size, Some(end), false, false);
  }
  pub(crate) fn link_not_return_function(&mut self, id: LabelId, insts: &[Inst], stack_size: i32) {
    let end = self.id();
    self.link_label(id, insts, stack_size, Some(end), true, false);
  }
  pub(crate) fn use_function(&mut self, caller: LabelId, id: LabelId) {
    match self.functions.entry(caller) {
      Entry::Occupied(mut entry) => entry.get_mut().dep.uses.push(id),
      Entry::Vacant(entry) => {
        entry.insert(CompiledFunc {
          insts: vec![],
          dep: Dependency { id: caller, uses: vec![id] },
          seh: None,
        });
      }
    }
  }
}