public JParser(IEnumerable<string> path, string save) { UppaalModel model = new UppaalModel(); var jClasses = new List<JClass>(); ClassNames.Add("Object"); foreach (var p in path) { var jClass = new JClass(p); ClassNames.Add(jClass.Name); jClasses.Add(jClass); foreach (var method in jClass.Methods) { var methodName = JClass.FirstNonKeyword(method.First()); if (!MethodNames.Contains(methodName)) { MethodNames.Add(methodName); } } } foreach (var jClass in jClasses) { model.AddTemplates(jClass); } var methods = new List<string>(); foreach (var jClass in jClasses) { jClass.SetSuper(jClasses); methods.AddRange(jClass.Methods.Select(x => jClass.Name + "_" + JClass.FirstNonKeyword(x.First()))); } //Build the heap foreach (var jClass in jClasses) { jClass.UpdateFields(); } foreach (var jClass in jClasses) { jClass.FindAloc(); } //var heap = AllocateHeap(JClass.GetAloc(jClasses.First().GetMethod("install")), jClasses); //Add Invoke model.AddInvokevirtual(jClasses); model.InitDec(10,3,3, methods); model.Save(save); }
public void SetSuper(List<JClass> classes) { if (classSig.Contains(" extends ")) { var superName = classSig.Split(new string[] { " extends " }, StringSplitOptions.None).Last(); foreach (var cls in classes) { if (cls.Name == superName) { super = cls; } } } }
//Adds method templates from jbc public void AddTemplates(JClass cls) { for(int i = 0; i < cls.Methods.Count; i++) { templates.Add(new Template(cls.Methods[i], cls, i)); } }
public Template(List<string> method, JClass self, int catchIndex) { classSelf = self; name = self.Name + "_" + JClass.FirstNonKeyword(method.First()); Locations = ResolveLocations(method); // instruction switch case ResolveCode(catchIndex); localDeclarations = @"const int os_size = 10; const int locs_size = 10; int os[os_size]; int osp = 0; int locs[locs_size]; void osp_inc(){ if (osp >= os_size - 1){ opstack_fault = true; return; } osp++; return; } void osp_dec(int i){ if (osp < i){ opstack_fault = true; return; } osp -= i; return; } bool ifcmpme(){ if (osp > 1){ return os[osp-2] >= os[osp - 1]; } return false; } bool ifcmpeq(){ if (osp > 1){ return os[osp-2] == os[osp - 1]; } return false; } bool ifcmpge(){ if (osp > 1){ return os[osp - 2] >= os[osp - 1] ; } return false; } bool ifcmpne(){ if (osp > 1){ return os[osp - 2] != os[osp - 1] ; } return false; } bool ifeq(){ if (osp > 0){ return os[osp - 1] == 0; } return false; }"; InitialLocation = Locations.First(); }