Skip to content

Commit

Permalink
fixes incorrect setup of vm and add missed methods
Browse files Browse the repository at this point in the history
  • Loading branch information
0xF6 committed May 12, 2024
1 parent 009d23f commit ab13557
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 55 deletions.
16 changes: 8 additions & 8 deletions runtime/ishtar.vm/VirtualMachine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,21 @@ public static VirtualMachine Create(string name)
vm.Config = new VMConfig();
vm.Vault = new AppVault(vm, name);
vm.trace = new IshtarTrace();
vm.Types = IshtarTypes.Create();
vm.Types = IshtarTypes.Create(vm.Vault);
vm.GC = new IshtarGC(vm);

vm.InternalModule = vm.Vault.DefineModule("internal");

vm.InternalClass = vm.InternalModule->DefineClass("sys%global::__internal__/global".L(),
vm.Types->ObjectClass);

vm.Frames = new IshtarFrames(vm);
vm.watcher = new DefaultWatchDog(vm);

vm.Config = new VMConfig();
vm.NativeStorage = new NativeStorage(vm);
vm.GC.init();


vm.InternalModule = vm.Vault.DefineModule("internal");

vm.InternalModule->DefineClass("sys%global::__internal__/global".L(),
vm.Types->ObjectClass);


vm.FFI = new ForeignFunctionInterface(vm);


Expand Down
6 changes: 5 additions & 1 deletion runtime/ishtar.vm/runtime/AppVault.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,11 @@ private void ResolverOnResolved(in RuntimeIshtarModule* module)

public RuntimeIshtarModule* DefineModule(string @internal)
{
throw new NotImplementedException();
var module = IshtarGC.AllocateImmortal<RuntimeIshtarModule>();

*module = new RuntimeIshtarModule(vm.Vault, @internal, module);

return module;
}
}

Expand Down
4 changes: 3 additions & 1 deletion runtime/ishtar.vm/runtime/IshtarGC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ public class Native
[DllImport(LIBNAME)]
public static extern nint GC_debug_malloc_atomic_uncollectable(uint size, string file, int line);

[DllImport(LIBNAME)]
public static extern nint GC_debug_malloc_uncollectable(uint size, string file, int line);

// GC_finalize_all

Expand Down Expand Up @@ -221,7 +223,7 @@ public void unlink(void** link_addr, bool trackable)

public void* alloc_atomic(uint size) => (void*)Native.GC_debug_malloc_atomic_uncollectable(size, "empty.vein", 0);

public void* alloc_immortal(uint size) => throw new NotImplementedException();
public void* alloc_immortal(uint size) => (void*)Native.GC_debug_malloc_uncollectable(size, "empty.vein", 0);

public void add_roots(void* ptr) => throw new NotImplementedException();

Expand Down
92 changes: 58 additions & 34 deletions runtime/ishtar.vm/runtime/vm/IshtarTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,7 @@ public readonly unsafe struct IshtarTypes(

public readonly DirectNativeList<RuntimeIshtarClass>* All = DirectNativeList<RuntimeIshtarClass>.New(32);

private readonly DirectNativeDictionary<int, RuntimeIshtarClass>* Mapping =
DirectNativeDictionary<int, RuntimeIshtarClass>.New();
private readonly DirectNativeDictionary<int, RuntimeIshtarClass>* Mapping = DirectNativeDictionary<int, RuntimeIshtarClass>.New();


public RuntimeIshtarClass* ByTypeCode(VeinTypeCode code)
Expand All @@ -72,58 +71,83 @@ public readonly unsafe struct IshtarTypes(
=> All->FirstOrNull(x => x->FullName->Equal(name));


public static IshtarTypes* Create()
public static IshtarTypes* Create(AppVault vault)
{
var r = IshtarGC.AllocateImmortal<IshtarTypes>();
var module = IshtarGC.AllocateImmortal<RuntimeIshtarModule>();

var module = new RuntimeIshtarModule();

*module = new RuntimeIshtarModule(vault, "unnamed_types", module);


var objectClass = r->create($"std%global::vein/lang/Object".L(), null, &module, TYPE_OBJECT);
var valueTypeClass = r->create($"std%global::vein/lang/ValueType".L(), null, &module, TYPE_OBJECT);
var objectClass = r->create($"std%global::vein/lang/Object".L(), null, module, TYPE_OBJECT);
var valueTypeClass = r->create($"std%global::vein/lang/ValueType".L(), null, module, TYPE_OBJECT);

*r = new IshtarTypes(
objectClass,
valueTypeClass,
r->create($"std%global::vein/lang/Void".L(), valueTypeClass, &module, TYPE_VOID),
r->create($"std%global::vein/lang/String".L(), objectClass, &module, TYPE_STRING),
r->create($"std%global::vein/lang/Byte".L(), valueTypeClass, &module, TYPE_U1),
r->create($"std%global::vein/lang/SByte".L(), valueTypeClass, &module, TYPE_I1),
r->create($"std%global::vein/lang/Int16".L(), valueTypeClass, &module, TYPE_I2),
r->create($"std%global::vein/lang/Int32".L(), valueTypeClass, &module, TYPE_I4),
r->create($"std%global::vein/lang/Int64".L(), valueTypeClass, &module, TYPE_I8),
r->create($"std%global::vein/lang/UInt16".L(), valueTypeClass, &module, TYPE_U2),
r->create($"std%global::vein/lang/UInt32".L(), valueTypeClass, &module, TYPE_U4),
r->create($"std%global::vein/lang/UInt64".L(), valueTypeClass, &module, TYPE_U8),
r->create($"std%global::vein/lang/Half".L(), valueTypeClass, &module, TYPE_R2),
r->create($"std%global::vein/lang/Float".L(), valueTypeClass, &module, TYPE_R4),
r->create($"std%global::vein/lang/Double".L(), valueTypeClass, &module, TYPE_R8),
r->create($"std%global::vein/lang/Decimal".L(), valueTypeClass, &module, TYPE_R16),
r->create($"std%global::vein/lang/Boolean".L(), valueTypeClass, &module, TYPE_BOOLEAN),
r->create($"std%global::vein/lang/Char".L(), valueTypeClass, &module, TYPE_CHAR),
r->create($"std%global::vein/lang/Array".L(), objectClass, &module, TYPE_ARRAY),
r->create($"std%global::vein/lang/Exception".L(), objectClass, &module, TYPE_CLASS),
r->create($"std%global::vein/lang/Raw".L(), valueTypeClass, &module, TYPE_RAW),
r->create($"std%global::vein/lang/Aspect".L(), objectClass, &module, TYPE_CLASS),
r->create($"std%global::vein/lang/Function".L(), objectClass, &module, TYPE_FUNCTION)
r->create($"std%global::vein/lang/Void".L(), valueTypeClass, module, TYPE_VOID),
r->create($"std%global::vein/lang/String".L(), objectClass, module, TYPE_STRING),
r->create($"std%global::vein/lang/Byte".L(), valueTypeClass, module, TYPE_U1),
r->create($"std%global::vein/lang/SByte".L(), valueTypeClass, module, TYPE_I1),
r->create($"std%global::vein/lang/Int16".L(), valueTypeClass, module, TYPE_I2),
r->create($"std%global::vein/lang/Int32".L(), valueTypeClass, module, TYPE_I4),
r->create($"std%global::vein/lang/Int64".L(), valueTypeClass, module, TYPE_I8),
r->create($"std%global::vein/lang/UInt16".L(), valueTypeClass, module, TYPE_U2),
r->create($"std%global::vein/lang/UInt32".L(), valueTypeClass, module, TYPE_U4),
r->create($"std%global::vein/lang/UInt64".L(), valueTypeClass,module, TYPE_U8),
r->create($"std%global::vein/lang/Half".L(), valueTypeClass, module, TYPE_R2),
r->create($"std%global::vein/lang/Float".L(), valueTypeClass, module, TYPE_R4),
r->create($"std%global::vein/lang/Double".L(), valueTypeClass, module, TYPE_R8),
r->create($"std%global::vein/lang/Decimal".L(), valueTypeClass, module, TYPE_R16),
r->create($"std%global::vein/lang/Boolean".L(), valueTypeClass, module, TYPE_BOOLEAN),
r->create($"std%global::vein/lang/Char".L(), valueTypeClass, module, TYPE_CHAR),
r->create($"std%global::vein/lang/Array".L(), objectClass, module, TYPE_ARRAY),
r->create($"std%global::vein/lang/Exception".L(), objectClass, module, TYPE_CLASS),
r->create($"std%global::vein/lang/Raw".L(), valueTypeClass, module, TYPE_RAW),
r->create($"std%global::vein/lang/Aspect".L(), objectClass, module, TYPE_CLASS),
r->create($"std%global::vein/lang/Function".L(), objectClass, module, TYPE_FUNCTION)
);
r->Add(objectClass);
r->Add(valueTypeClass);
r->Add(r->VoidClass);
r->Add(r->ByteClass);
r->Add(r->SByteClass);
r->Add(r->Int32Class);
r->Add(r->Int16Class);
r->Add(r->Int64Class);
r->Add(r->UInt32Class);
r->Add(r->UInt16Class);
r->Add(r->UInt64Class);
r->Add(r->HalfClass);
r->Add(r->FloatClass);
r->Add(r->DoubleClass);
r->Add(r->DecimalClass);
r->Add(r->BoolClass);
r->Add(r->CharClass);
r->Add(r->ArrayClass);
r->Add(r->RawClass);
r->Add(r->FunctionClass);

/*if (clazz->TypeCode is not TYPE_OBJECT and not TYPE_CLASS)

Check warning on line 131 in runtime/ishtar.vm/runtime/vm/IshtarTypes.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

runtime/ishtar.vm/runtime/vm/IshtarTypes.cs#L131

Remove this commented out code.
Mapping->Add((int)clazz->TypeCode, clazz);
Add(clazz);*/
/*if (Mapping is null) Mapping
if (All is null) All = */
return r;
}

public void Add(in RuntimeIshtarClass* clazz)
=> All->Add(clazz);
{
All->Add(clazz);
Mapping->Add((int)clazz->TypeCode, clazz);
}

private RuntimeIshtarClass* create(RuntimeQualityTypeName* name, RuntimeIshtarClass* parent, RuntimeIshtarModule* module, VeinTypeCode typeCode, bool autoAdd = true)
{
var clazz = IshtarGC.AllocateImmortal<RuntimeIshtarClass>();
*clazz = new RuntimeIshtarClass(name, parent, module);
*clazz = new RuntimeIshtarClass(name, parent, module, clazz);
clazz->TypeCode = typeCode;

Mapping->Add((int)clazz->TypeCode, clazz);

Add(clazz);
return clazz;
}
}
16 changes: 9 additions & 7 deletions runtime/ishtar.vm/runtime/vm/RuntimeIshtarClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ namespace ishtar
using static vein.runtime.VeinTypeCode;
using static WNE;

public interface ITransitionAlignment<in TKey, out TValue>
public interface ITransitionAlignment<TKey, TValue>
{
TValue this[TKey key] { get; }
}

public unsafe interface IUnsafeTransitionAlignment<in TKey, out TValue> where TValue : unmanaged
public unsafe interface IUnsafeTransitionAlignment<TKey, TValue> where TValue : unmanaged
{
TValue* this[TKey key] { get; }
}
Expand Down Expand Up @@ -65,17 +65,19 @@ public VeinTypeCode TypeCode

#endregion

internal RuntimeIshtarClass(RuntimeQualityTypeName* name, RuntimeIshtarClass* parent, RuntimeIshtarModule* module)
internal RuntimeIshtarClass(RuntimeQualityTypeName* name, RuntimeIshtarClass* parent, RuntimeIshtarModule* module, RuntimeIshtarClass* self)
{
_selfReference = self;
if (module is null) return;
ID = module->Vault->Value.TokenGranted.GrantClassID();
runtime_token = new RuntimeToken(module->ID, ID);
Original = new VeinClass((*name).T(), parent->Original, module->Original->Value);
if (parent is null)
Original = new VeinClass((*name).T(), (VeinClass)null, module->Original->Value);
else
Original = new VeinClass((*name).T(), parent->Original, module->Original->Value);
Owner = module;
Parent = parent;
FullName = name;
fixed (RuntimeIshtarClass* p = &this)
_selfReference = p;
}

internal void ReplaceParent(RuntimeIshtarClass* parent)
Expand Down Expand Up @@ -118,7 +120,7 @@ internal void ReplaceParent(RuntimeIshtarClass* parent)
internal RuntimeIshtarMethod* DefineMethod(string name, RuntimeIshtarClass* returnType, MethodFlags flags, DirectNativeList<RuntimeMethodArgument>* args)
{
var method = IshtarGC.AllocateImmortal<RuntimeIshtarMethod>();

*method = new RuntimeIshtarMethod(name, flags, returnType, _selfReference, args);

Original.Methods.Add(method->Original);
Expand Down
3 changes: 3 additions & 0 deletions runtime/ishtar.vm/runtime/vm/RuntimeIshtarMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ public VeinArgumentRef Original

public static DirectNativeList<RuntimeMethodArgument>* Create(VirtualMachine vm, VeinArgumentRef[] data)
{
if (data.Length == 0)
return DirectNativeList<RuntimeMethodArgument>.New(1);

var lst = DirectNativeList<RuntimeMethodArgument>.New(data.Length);

foreach (var tuple in data)
Expand Down
9 changes: 5 additions & 4 deletions runtime/ishtar.vm/runtime/vm/RuntimeIshtarModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@ public unsafe struct RuntimeIshtarModule
private RuntimeIshtarModule* _selfRef;


private RuntimeIshtarModule(AppVault vault, string name, RuntimeIshtarModule* self)
public RuntimeIshtarModule(AppVault vault, string name, RuntimeIshtarModule* self)
{
Original = WeakRef<VeinModule>.Create(new VeinModule(name, new Version(1, 0), new VeinCore()));
Vault = WeakRef<AppVault>.Create(vault);
_name = StringStorage.Intern(name);
_selfRef = self;
}



public DirectNativeList<RuntimeIshtarClass>* class_table { get; }
= DirectNativeList<RuntimeIshtarClass>.New(64);
Expand Down Expand Up @@ -193,7 +194,7 @@ bool filter(RuntimeIshtarClass* x)
{
var clazz = IshtarGC.AllocateImmortal<RuntimeIshtarClass>();

*clazz = new RuntimeIshtarClass(fullName, parent, _selfRef);
*clazz = new RuntimeIshtarClass(fullName, parent, _selfRef, clazz);

class_table->Add(clazz);

Expand All @@ -204,7 +205,7 @@ bool filter(RuntimeIshtarClass* x)
{
var clazz = IshtarGC.AllocateImmortal<RuntimeIshtarClass>();

*clazz = new RuntimeIshtarClass(fullName, null, _selfRef);
*clazz = new RuntimeIshtarClass(fullName, null, _selfRef, clazz);

clazz->Original.Flags |= ClassFlags.Unresolved;

Expand Down

0 comments on commit ab13557

Please sign in to comment.