• Tesis

    JoinPoint Language Definition

    Luego de unos 15 días intensos sobre mi tesis ya tengo andando una pequeña parte andando de lo que será la nueva API, funcionando e integrada con el JIT. Antes de comentar como funciona vamos por el primer ejemplo que consta de dos partes. Por un lado una clase común y corriente que simularía ser la aplicación : using System; public class Normal { public Normal() { Metodo1(26); } public void Metodo1(int i) { Console.WriteLine("Aca"); } static public void Main(string [] args) { new Normal(); } } Y por otro una clase que solo tiene definiciones de JoinPoints (pueden estar mezcladas, no hace falta separarlo) using System; using Weaving; public…

  • Programación

    Cómo perder un bit

    Un proyecto que hicimos a principio de año es un soft que maneja una PC para una rockola con su respectiva interfaz de hardware («la caja» de ahora en más) para interactuar con la botonera. En estos días el cliente nos pidió que agregaramos alguna validación para que la caja y el programa se aseguren que son «originales» (no es algo que me agrade agregar, pero el software es del cliente). En fin, la cosa es que estuve todo el viernes y todo el lunes sin poderlo hacer andar. La caja me respondía perfecto salvo en un caso: cuando me llegaba 0x3F pinchaba. Lo peor es que era un valor…

  • Tesis

    Pattern matching made easy

    Siguiendo en carrera para ir cerrando problemas para mi tesis en esta oportunidad necesité buscar una manera simple de hacer pattern matching. El uso que le iba a dar era muy simple y no necesitaba mucho poder a la hora de las expresiones que se iban a definir. La idea es poder definir qué métodos quiere uno interceptar usando algún patrón. Por ejemplo, si queremos ejecutar cierto código antes de cualquier método de la clase Test, simplemente debería bastar con poder especificar «Test:* (*)». En este caso acepto cualquier método con cualquier cantidad de parámetros (puede ser vacío). O si queremos anticipar las llamadas a ToString podríamos definir «*:ToString ()».…

  • Tesis

    Generando assembler

    En esta oportunidad para mi Tesis necesité ver cómo modificar el assembler generado por el JIT para agregar instrucciones antes y después de la llamada a un método. El código assembler generado originalmente es el siguiente : 00000000 (Test_Bar): (bb):3 0: 55 push %ebp 1: 8b ec mov %esp,%ebp 3: 83 ec 08 sub $0x8,%esp 6: 83 ec 0c sub $0xc,%esp 9: 68 c0 8f 05 00 push $0x58fc0 e: e8 e5 fd ff ff call fffffdf8 (Test_Bar +0xfffffdf8) 13: 83 c4 10 add $0x10,%esp (bb):1 16: c9 leave 17: c3 ret Mi primer intento fue fácil y consistió en ejecutar una función desde assembler antes de cada método generado…

  • Tesis

    Mono Internal Calls

    Para mi tesis una de las cosas que tenía que lograr era pasar datos desde una aplicación escrita en C# (en realidad en cualquier lenguaje soportado) y el JIT. No quiero entrar en mucho detalle del por qué tengo que hacerlo ni cómo (porque la verdad esto último todavía no lo tengo resuelto :P). Empezando a investigar caí en Embedding Mono, un articulo donde explican cómo embeber Mono en tu aplicación, por ejemplo para permitir plugins en .NET. El artículo tiene poco que ver con lo que yo estoy haciendo, pero me orientó en mi tarea. Con Mono tenemos dos formas de ejecutar código nativo : P/Invoke e Internall Calls.…