Initial commit
This commit is contained in:
commit
cd185ed2e5
|
@ -0,0 +1,33 @@
|
|||
# Common IntelliJ Platform excludes
|
||||
|
||||
# User specific
|
||||
**/.idea/**/workspace.xml
|
||||
**/.idea/**/tasks.xml
|
||||
**/.idea/shelf/*
|
||||
**/.idea/dictionaries
|
||||
|
||||
# Sensitive or high-churn files
|
||||
**/.idea/**/dataSources/
|
||||
**/.idea/**/dataSources.ids
|
||||
**/.idea/**/dataSources.xml
|
||||
**/.idea/**/dataSources.local.xml
|
||||
**/.idea/**/sqlDataSources.xml
|
||||
**/.idea/**/dynamic.xml
|
||||
|
||||
# Rider
|
||||
# Rider auto-generates .iml files, and contentModel.xml
|
||||
**/.idea/**/*.iml
|
||||
**/.idea/**/contentModel.xml
|
||||
**/.idea/**/modules.xml
|
||||
|
||||
*.suo
|
||||
*.user
|
||||
.vs/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
_UpgradeReport_Files/
|
||||
[Pp]ackages/
|
||||
|
||||
Thumbs.db
|
||||
Desktop.ini
|
||||
.DS_Store
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ContentModelUserStore">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,28 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PorygonSharp", "PorygonSharp\PorygonSharp.csproj", "{0C0E73BC-C4D9-498F-8A41-E247B104DF84}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PorygonSharpTests", "PorygonSharpTests\PorygonSharpTests.csproj", "{095D66BC-028A-49D0-8E4B-ED407D3AA20F}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PorygonSharpCLI", "PorygonSharpCLI\PorygonSharpCLI.csproj", "{8F945B4C-8F2A-401C-8568-FD2BC94E5A39}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{0C0E73BC-C4D9-498F-8A41-E247B104DF84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0C0E73BC-C4D9-498F-8A41-E247B104DF84}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0C0E73BC-C4D9-498F-8A41-E247B104DF84}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0C0E73BC-C4D9-498F-8A41-E247B104DF84}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{095D66BC-028A-49D0-8E4B-ED407D3AA20F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{095D66BC-028A-49D0-8E4B-ED407D3AA20F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{095D66BC-028A-49D0-8E4B-ED407D3AA20F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{095D66BC-028A-49D0-8E4B-ED407D3AA20F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8F945B4C-8F2A-401C-8568-FD2BC94E5A39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8F945B4C-8F2A-401C-8568-FD2BC94E5A39}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8F945B4C-8F2A-401C-8568-FD2BC94E5A39}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8F945B4C-8F2A-401C-8568-FD2BC94E5A39}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,2 @@
|
|||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Porygon/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
|
@ -0,0 +1,21 @@
|
|||
namespace PorygonSharp.DiagnosticHandling
|
||||
{
|
||||
public enum DiagnosticCode
|
||||
{
|
||||
// Lex diagnostics
|
||||
UnexpectedCharacter,
|
||||
InvalidStringControlCharacter,
|
||||
|
||||
// Parse diagnostics
|
||||
UnexpectedToken,
|
||||
|
||||
// Bind diagnostics
|
||||
NoBinaryOperationFound,
|
||||
NoUnaryOperationFound,
|
||||
CantAssignVariable,
|
||||
VariableNotFound,
|
||||
ExpressionIsNotAFunction,
|
||||
ParameterCountMismatch,
|
||||
ParameterTypeMismatch,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace PorygonSharp.DiagnosticHandling
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DiagnosticItem
|
||||
{
|
||||
private readonly int _severity;
|
||||
private readonly DiagnosticCode _code;
|
||||
private readonly uint _start;
|
||||
private readonly uint _length;
|
||||
|
||||
public DiagnosticCode GetCode()
|
||||
{
|
||||
return _code;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace PorygonSharp.DiagnosticHandling
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct InternalDiagnostics
|
||||
{
|
||||
private readonly byte _hasErrors;
|
||||
|
||||
public bool HasErrors()
|
||||
{
|
||||
return _hasErrors == 1;
|
||||
}
|
||||
}
|
||||
|
||||
public class Diagnostics : IDisposable
|
||||
{
|
||||
private readonly IntPtr _handle;
|
||||
private InternalDiagnostics _internal;
|
||||
|
||||
public Diagnostics(IntPtr handle)
|
||||
{
|
||||
_handle = handle;
|
||||
_internal = Marshal.PtrToStructure<InternalDiagnostics>(handle);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Marshal.FreeHGlobal(_handle);
|
||||
}
|
||||
|
||||
public bool HasErrors()
|
||||
{
|
||||
return _internal.HasErrors();
|
||||
}
|
||||
|
||||
public int DiagnosticsCount()
|
||||
{
|
||||
return GetDiagnosticsCount(_handle);
|
||||
}
|
||||
|
||||
public IEnumerable<DiagnosticItem> GetDiagnostics()
|
||||
{
|
||||
var count = DiagnosticsCount();
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var ptr = GetDiagnosticAt(_handle, i);
|
||||
yield return Marshal.PtrToStructure<DiagnosticItem>(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("libPorygonLang", EntryPoint = "GetDiagnosticsCount")]
|
||||
private static extern int GetDiagnosticsCount(IntPtr ptr);
|
||||
|
||||
[DllImport("libPorygonLang", EntryPoint = "GetDiagnosticAt")]
|
||||
private static extern IntPtr GetDiagnosticAt(IntPtr ptr, int position);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace PorygonSharp
|
||||
{
|
||||
public class EvalValue : IDisposable
|
||||
{
|
||||
private IntPtr _handle;
|
||||
|
||||
public EvalValue(IntPtr handle)
|
||||
{
|
||||
_handle = handle;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_handle != IntPtr.Zero)
|
||||
{
|
||||
Marshal.FreeHGlobal(_handle);
|
||||
_handle = IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
public TypeClass GetTypeClass()
|
||||
{
|
||||
return (TypeClass)GetTypeClass(_handle);
|
||||
}
|
||||
|
||||
public long EvaluateInteger()
|
||||
{
|
||||
return EvaluateInteger(_handle);
|
||||
}
|
||||
|
||||
public double EvaluateFloat()
|
||||
{
|
||||
return EvaluateFloat(_handle);
|
||||
}
|
||||
|
||||
public bool EvaluateBool()
|
||||
{
|
||||
return EvaluateBool(_handle);
|
||||
}
|
||||
|
||||
public string EvaluateString()
|
||||
{
|
||||
var ptr = EvaluateString(_handle);
|
||||
return Marshal.PtrToStringUTF8(ptr);
|
||||
}
|
||||
|
||||
[DllImport("libPorygonLang", EntryPoint = "GetEvalValueTypeClass", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern int GetTypeClass(IntPtr ptr);
|
||||
[DllImport("libPorygonLang", EntryPoint = "GetEvalValueType", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern IntPtr GetScriptType(IntPtr ptr);
|
||||
[DllImport("libPorygonLang", EntryPoint = "EvaluateEvalValueInteger", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern long EvaluateInteger(IntPtr ptr);
|
||||
[DllImport("libPorygonLang", EntryPoint = "EvaluateEvalValueFloat", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern double EvaluateFloat(IntPtr ptr);
|
||||
[DllImport("libPorygonLang", EntryPoint = "EvaluateEvalValueBool", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern bool EvaluateBool(IntPtr ptr);
|
||||
[DllImport("libPorygonLang", EntryPoint = "EvaluateEvalValueString",CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern IntPtr EvaluateString(IntPtr ptr);
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,70 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using PorygonSharp.DiagnosticHandling;
|
||||
|
||||
namespace PorygonSharp
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct InternalScript
|
||||
{
|
||||
private readonly IntPtr _evaluator;
|
||||
private readonly IntPtr _scriptVariables;
|
||||
private readonly IntPtr _boundScript;
|
||||
internal readonly IntPtr Diagnostics;
|
||||
}
|
||||
|
||||
public class Script : IDisposable
|
||||
{
|
||||
private readonly IntPtr _internalScriptHandle;
|
||||
private readonly InternalScript _internalScript;
|
||||
|
||||
private Diagnostics _diagnostics;
|
||||
public Diagnostics Diagnostics => _diagnostics ?? (_diagnostics = new Diagnostics(_internalScript.Diagnostics));
|
||||
|
||||
public Script(string s)
|
||||
{
|
||||
_internalScriptHandle = Create(new StringBuilder(s));
|
||||
_internalScript = Marshal.PtrToStructure<InternalScript>(_internalScriptHandle);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Marshal.FreeHGlobal(_internalScriptHandle);
|
||||
Diagnostics.Dispose();
|
||||
}
|
||||
|
||||
public void Evaluate()
|
||||
{
|
||||
Evaluate(_internalScriptHandle);
|
||||
}
|
||||
|
||||
public EvalValue GetLastValue()
|
||||
{
|
||||
var ptr = GetLastValue(_internalScriptHandle);
|
||||
return new EvalValue(ptr);
|
||||
}
|
||||
|
||||
public bool HasVariable(string key)
|
||||
{
|
||||
return HasVariable(_internalScriptHandle, key);
|
||||
}
|
||||
|
||||
public EvalValue GetVariable(string key)
|
||||
{
|
||||
var ptr = GetVariable(_internalScriptHandle, key);
|
||||
return new EvalValue(ptr);
|
||||
}
|
||||
|
||||
[DllImport("libPorygonLang", EntryPoint = "CreateScript", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern IntPtr Create(StringBuilder s);
|
||||
[DllImport("libPorygonLang", EntryPoint = "EvaluateScript", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern void Evaluate(IntPtr script);
|
||||
[DllImport("libPorygonLang", EntryPoint = "GetLastValue", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern IntPtr GetLastValue(IntPtr script);
|
||||
[DllImport("libPorygonLang", EntryPoint = "HasVariable", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern bool HasVariable(IntPtr script, string key);
|
||||
[DllImport("libPorygonLang", EntryPoint = "GetVariable", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern IntPtr GetVariable(IntPtr script, string key);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
namespace PorygonSharp
|
||||
{
|
||||
public enum TypeClass
|
||||
{
|
||||
Error,
|
||||
Nil,
|
||||
Number,
|
||||
Bool,
|
||||
String,
|
||||
Function,
|
||||
UserData,
|
||||
Table,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PorygonSharp\PorygonSharp.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using PorygonSharp;
|
||||
|
||||
namespace PorygonSharpCLI
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
for (var i = 0; i < 100000; i++)
|
||||
{
|
||||
var script = new Script("a = 500");
|
||||
script.Evaluate();
|
||||
script.Dispose();
|
||||
}
|
||||
sw.Stop();
|
||||
Console.WriteLine($"Time elapsed: {sw.ElapsedMilliseconds}");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="nunit" Version="3.12.0" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="3.13.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PorygonSharp\PorygonSharp.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,97 @@
|
|||
using System;
|
||||
using NUnit.Framework;
|
||||
using PorygonSharp;
|
||||
|
||||
namespace PorygonSharpTests
|
||||
{
|
||||
public class Tests
|
||||
{
|
||||
[Test]
|
||||
public void Test1()
|
||||
{
|
||||
using (var script = new Script("true"))
|
||||
{
|
||||
var diags = script.Diagnostics.GetDiagnostics();
|
||||
foreach (var diag in diags)
|
||||
{
|
||||
throw new Exception(diag.GetCode().ToString());
|
||||
}
|
||||
Assert.False(script.Diagnostics.HasErrors());
|
||||
}
|
||||
}
|
||||
[Test]
|
||||
public void Test2()
|
||||
{
|
||||
using (var script = new Script("1+true"))
|
||||
{
|
||||
Assert.True(script.Diagnostics.HasErrors());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test3()
|
||||
{
|
||||
using (var script = new Script("1+10"))
|
||||
{
|
||||
script.Evaluate();
|
||||
var lastVal = script.GetLastValue();
|
||||
Assert.AreEqual(TypeClass.Number, lastVal.GetTypeClass());
|
||||
var val = lastVal.EvaluateInteger();
|
||||
Assert.AreEqual(11, val);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test4()
|
||||
{
|
||||
using (var script = new Script("1+10.24"))
|
||||
{
|
||||
script.Evaluate();
|
||||
var lastVal = script.GetLastValue();
|
||||
Assert.AreEqual(TypeClass.Number, lastVal.GetTypeClass());
|
||||
var val = lastVal.EvaluateFloat();
|
||||
Assert.AreEqual(11.24d, val, 5);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test5()
|
||||
{
|
||||
using (var script = new Script("true and true"))
|
||||
{
|
||||
script.Evaluate();
|
||||
var lastVal = script.GetLastValue();
|
||||
Assert.AreEqual(TypeClass.Bool, lastVal.GetTypeClass());
|
||||
var val = lastVal.EvaluateBool();
|
||||
Assert.AreEqual(true, val);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test6()
|
||||
{
|
||||
using (var script = new Script("'foo' + 'bar'"))
|
||||
{
|
||||
script.Evaluate();
|
||||
var lastVal = script.GetLastValue();
|
||||
Assert.AreEqual(TypeClass.String, lastVal.GetTypeClass());
|
||||
var val = lastVal.EvaluateString();
|
||||
Assert.AreEqual("foobar", val);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test7()
|
||||
{
|
||||
using (var script = new Script("a = 100 + 50"))
|
||||
{
|
||||
script.Evaluate();
|
||||
var variable = script.GetVariable("a");
|
||||
Assert.AreEqual(TypeClass.Number, variable.GetTypeClass());
|
||||
var val = variable.EvaluateInteger();
|
||||
Assert.AreEqual(150, val);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Binary file not shown.
Loading…
Reference in New Issue