Merge branch 'master' into functional

This commit is contained in:
Bob Nystrom
2015-11-28 10:05:10 -08:00
8 changed files with 323 additions and 39 deletions

22
.gitignore vendored
View File

@ -1,23 +1,27 @@
# Build outputs. # Build outputs.
bin/ /bin
lib/ /lib
wren /wren
# Intermediate files. # Intermediate files.
build/ /build
deps/ /deps
.sass-cache/ /.sass-cache
*.pyc
# I leave a temporary Wren script at the top level so that I can quickly test # I leave a temporary Wren script at the top level so that I can quickly test
# stuff. # stuff.
scratch.wren /scratch.wren
# The baseline file is machine-specific, so doesn't get checked in. # The baseline file is machine-specific, so doesn't get checked in.
test/benchmark/baseline.txt /test/benchmark/baseline.txt
# XCode user-specific stuff. # XCode user-specific stuff.
xcuserdata/ xcuserdata/
*.xccheckout
# Allow Visual Studio project files.
!wren/
!wren_lib/
# Visual Studio cache files. # Visual Studio cache files.
ipch/ ipch/

View File

@ -328,7 +328,7 @@ constructors, etc.
## Fields ## Fields
All state stored in instances is stored in *fields*. Each field has a named All state stored in instances is stored in *fields*. Each field has a name
that starts with an underscore. that starts with an underscore.
:::wren :::wren
@ -503,7 +503,7 @@ This means you can do `super` calls inside a constructor:
**TODO: Integrate better into page. Should explain this before mentioning **TODO: Integrate better into page. Should explain this before mentioning
super above.** super above.**
Sometimes you want to invoke a method on yourself, but only methods defined in Sometimes you want to invoke a method on yourself, but using methods defined in
one of your [superclasses](classes.html#inheritance). You typically do this in one of your [superclasses](classes.html#inheritance). You typically do this in
an overridden method when you want to access the original method being an overridden method when you want to access the original method being
overridden. overridden.

View File

@ -8,6 +8,13 @@
#include "wren.h" #include "wren.h"
#include <stdio.h> #include <stdio.h>
#include <fcntl.h>
typedef struct sFileRequestData
{
WrenValue* fiber;
uv_buf_t buffer;
} FileRequestData;
static const int stdinDescriptor = 0; static const int stdinDescriptor = 0;
@ -67,8 +74,12 @@ static bool handleRequestError(uv_fs_t* request)
{ {
if (request->result >= 0) return false; if (request->result >= 0) return false;
WrenValue* fiber = (WrenValue*)request->data; FileRequestData* data = (FileRequestData*)request->data;
WrenValue* fiber = (WrenValue*)data->fiber;
schedulerResumeError(fiber, uv_strerror((int)request->result)); schedulerResumeError(fiber, uv_strerror((int)request->result));
free(data);
uv_fs_req_cleanup(request); uv_fs_req_cleanup(request);
free(request); free(request);
return true; return true;
@ -78,7 +89,11 @@ static bool handleRequestError(uv_fs_t* request)
uv_fs_t* createRequest(WrenValue* fiber) uv_fs_t* createRequest(WrenValue* fiber)
{ {
uv_fs_t* request = (uv_fs_t*)malloc(sizeof(uv_fs_t)); uv_fs_t* request = (uv_fs_t*)malloc(sizeof(uv_fs_t));
request->data = fiber;
FileRequestData* data = (FileRequestData*)malloc(sizeof(FileRequestData));
data->fiber = fiber;
request->data = data;
return request; return request;
} }
@ -87,8 +102,10 @@ uv_fs_t* createRequest(WrenValue* fiber)
// Returns the fiber that should be resumed after [request] completes. // Returns the fiber that should be resumed after [request] completes.
WrenValue* freeRequest(uv_fs_t* request) WrenValue* freeRequest(uv_fs_t* request)
{ {
WrenValue* fiber = (WrenValue*)request->data; FileRequestData* data = (FileRequestData*)request->data;
WrenValue* fiber = data->fiber;
free(data);
uv_fs_req_cleanup(request); uv_fs_req_cleanup(request);
free(request); free(request);
@ -111,7 +128,7 @@ void fileOpen(WrenVM* vm)
uv_fs_t* request = createRequest(wrenGetArgumentValue(vm, 2)); uv_fs_t* request = createRequest(wrenGetArgumentValue(vm, 2));
// TODO: Allow controlling flags and modes. // TODO: Allow controlling flags and modes.
uv_fs_open(getLoop(), request, path, O_RDONLY, S_IRUSR, openCallback); uv_fs_open(getLoop(), request, path, O_RDONLY, 0, openCallback);
} }
// Called by libuv when the stat call for size completes. // Called by libuv when the stat call for size completes.
@ -171,7 +188,9 @@ static void fileReadBytesCallback(uv_fs_t* request)
{ {
if (handleRequestError(request)) return; if (handleRequestError(request)) return;
uv_buf_t buffer = request->bufs[0]; FileRequestData* data = (FileRequestData*)request->data;
uv_buf_t buffer = data->buffer;
WrenValue* fiber = freeRequest(request); WrenValue* fiber = freeRequest(request);
// TODO: Having to copy the bytes here is a drag. It would be good if Wren's // TODO: Having to copy the bytes here is a drag. It would be good if Wren's
@ -190,12 +209,14 @@ void fileReadBytes(WrenVM* vm)
int fd = *(int*)wrenGetArgumentForeign(vm, 0); int fd = *(int*)wrenGetArgumentForeign(vm, 0);
// TODO: Assert fd != -1. // TODO: Assert fd != -1.
uv_buf_t buffer; FileRequestData* data = (FileRequestData*)request->data;
buffer.len = (size_t)wrenGetArgumentDouble(vm, 1); size_t length = (size_t)wrenGetArgumentDouble(vm, 1);
buffer.base = (char*)malloc(buffer.len);
data->buffer.len = length;
data->buffer.base = (char*)malloc(length);
// TODO: Allow passing in offset. // TODO: Allow passing in offset.
uv_fs_read(getLoop(), request, fd, &buffer, 1, 0, fileReadBytesCallback); uv_fs_read(getLoop(), request, fd, &data->buffer, 1, 0, fileReadBytesCallback);
} }
void fileSize(WrenVM* vm) void fileSize(WrenVM* vm)

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{EBF43135-4A7A-400A-8F23-DF49907025AA}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>wren</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\..\src\include</IncludePath>
<LibraryPath>$(SolutionDir)..\..\lib\$(Configuration)\;$(SolutionDir)..\..\util\deps\libuv\Release\lib\;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86)</LibraryPath>
<OutDir>$(SolutionDir)..\..\bin\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\..\build\cli\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>$(SolutionDir)..\..\src\include;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)..\..\lib\$(Configuration)\;$(SolutionDir)..\..\util\deps\libuv\Release\lib\;$(LibraryPath)</LibraryPath>
<OutDir>$(SolutionDir)..\..\bin\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\..\build\cli\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\src\cli;..\..\..\src\module;..\..\..\include;..\..\..\util\deps\libuv\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>wren_static_d.lib;libuv.lib;ws2_32.lib;psapi.lib;iphlpapi.lib;userenv.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\src;..\..\..\src\cli;..\..\..\src\module;..\..\..\include;..\..\..\util\deps\libuv\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>wren_static.lib;libuv.lib;ws2_32.lib;psapi.lib;iphlpapi.lib;userenv.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\cli\main.c" />
<ClCompile Include="..\..\..\src\cli\modules.c" />
<ClCompile Include="..\..\..\src\cli\vm.c" />
<ClCompile Include="..\..\..\src\module\io.c" />
<ClCompile Include="..\..\..\src\module\scheduler.c" />
<ClCompile Include="..\..\..\src\module\timer.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\include\wren.h" />
<ClInclude Include="..\..\..\src\cli\modules.h" />
<ClInclude Include="..\..\..\src\cli\vm.h" />
<ClInclude Include="..\..\..\src\module\io.h" />
<ClInclude Include="..\..\..\src\module\scheduler.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\wren_lib\wren_lib.vcxproj">
<Project>{89cf2c43-749e-4ec4-a7c3-3f22fba9b874}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\cli\main.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\cli\modules.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\cli\vm.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\module\io.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\module\scheduler.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\module\timer.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\include\wren.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\cli\modules.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\cli\vm.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\module\io.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\module\scheduler.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -39,14 +39,16 @@
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\..\src\include;</IncludePath> <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\..\src\include;$(SolutionDir)..\..\src\vm;$(SolutionDir)..\..\src\optional</IncludePath>
<TargetName>wren_static_d</TargetName> <TargetName>wren_static_d</TargetName>
<OutDir>$(SolutionDir)..\..\build\vs\$(Configuration)\</OutDir> <OutDir>$(SolutionDir)..\..\lib\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\..\build\lib\$(Configuration)\</IntDir>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\..\src\include</IncludePath> <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\..\src\include;$(SolutionDir)..\..\src\vm;$(SolutionDir)..\..\src\optional</IncludePath>
<TargetName>wren_static</TargetName> <TargetName>wren_static</TargetName>
<OutDir>$(SolutionDir)..\..\build\vs\$(Configuration)\</OutDir> <OutDir>$(SolutionDir)..\..\lib\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\..\build\lib\$(Configuration)\</IntDir>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
@ -79,24 +81,26 @@
<ClCompile Include="..\..\..\src\vm\wren_compiler.c" /> <ClCompile Include="..\..\..\src\vm\wren_compiler.c" />
<ClCompile Include="..\..\..\src\vm\wren_core.c" /> <ClCompile Include="..\..\..\src\vm\wren_core.c" />
<ClCompile Include="..\..\..\src\vm\wren_debug.c" /> <ClCompile Include="..\..\..\src\vm\wren_debug.c" />
<ClCompile Include="..\..\..\src\vm\wren_io.c" />
<ClCompile Include="..\..\..\src\vm\wren_meta.c" />
<ClCompile Include="..\..\..\src\vm\wren_primitive.c" /> <ClCompile Include="..\..\..\src\vm\wren_primitive.c" />
<ClCompile Include="..\..\..\src\vm\wren_utils.c" /> <ClCompile Include="..\..\..\src\vm\wren_utils.c" />
<ClCompile Include="..\..\..\src\vm\wren_value.c" /> <ClCompile Include="..\..\..\src\vm\wren_value.c" />
<ClCompile Include="..\..\..\src\vm\wren_vm.c" /> <ClCompile Include="..\..\..\src\vm\wren_vm.c" />
<ClCompile Include="..\..\..\src\optional\wren_opt_meta.c" />
<ClCompile Include="..\..\..\src\optional\wren_opt_random.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\src\include\wren.h" />
<ClInclude Include="..\..\..\src\vm\wren_common.h" /> <ClInclude Include="..\..\..\src\vm\wren_common.h" />
<ClInclude Include="..\..\..\src\vm\wren_compiler.h" /> <ClInclude Include="..\..\..\src\vm\wren_compiler.h" />
<ClInclude Include="..\..\..\src\vm\wren_core.h" /> <ClInclude Include="..\..\..\src\vm\wren_core.h" />
<ClInclude Include="..\..\..\src\vm\wren_debug.h" /> <ClInclude Include="..\..\..\src\vm\wren_debug.h" />
<ClInclude Include="..\..\..\src\vm\wren_io.h" />
<ClInclude Include="..\..\..\src\vm\wren_meta.h" />
<ClInclude Include="..\..\..\src\vm\wren_primitive.h" /> <ClInclude Include="..\..\..\src\vm\wren_primitive.h" />
<ClInclude Include="..\..\..\src\vm\wren_utils.h" /> <ClInclude Include="..\..\..\src\vm\wren_utils.h" />
<ClInclude Include="..\..\..\src\vm\wren_value.h" /> <ClInclude Include="..\..\..\src\vm\wren_value.h" />
<ClInclude Include="..\..\..\src\vm\wren_opcodes.h" />
<ClInclude Include="..\..\..\src\vm\wren_vm.h" /> <ClInclude Include="..\..\..\src\vm\wren_vm.h" />
<ClInclude Include="..\..\..\src\optional\wren_opt_meta.h" />
<ClInclude Include="..\..\..\src\optional\wren_opt_random.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@ -24,9 +24,6 @@
<ClCompile Include="..\..\..\src\vm\wren_debug.c"> <ClCompile Include="..\..\..\src\vm\wren_debug.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_io.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_utils.c"> <ClCompile Include="..\..\..\src\vm\wren_utils.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -36,14 +33,20 @@
<ClCompile Include="..\..\..\src\vm\wren_vm.c"> <ClCompile Include="..\..\..\src\vm\wren_vm.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_meta.c"> <ClCompile Include="..\..\..\src\vm\wren_primitive.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_primitive.c"> <ClCompile Include="..\..\..\src\optional\wren_opt_meta.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\optional\wren_opt_random.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\src\include\wren.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_common.h"> <ClInclude Include="..\..\..\src\vm\wren_common.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -56,23 +59,26 @@
<ClInclude Include="..\..\..\src\vm\wren_debug.h"> <ClInclude Include="..\..\..\src\vm\wren_debug.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_io.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_utils.h"> <ClInclude Include="..\..\..\src\vm\wren_utils.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_value.h"> <ClInclude Include="..\..\..\src\vm\wren_value.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_vm.h"> <ClInclude Include="..\..\..\src\vm\wren_opcodes.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_meta.h"> <ClInclude Include="..\..\..\src\vm\wren_vm.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_primitive.h"> <ClInclude Include="..\..\..\src\vm\wren_primitive.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\optional\wren_opt_meta.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\optional\wren_opt_random.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,82 @@
import re
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
from pygments.lexer import RegexLexer
from pygments.token import *
class WrenLexer(RegexLexer):
name = 'Wren'
aliases = ['wren']
filenames = ['*.wren']
flags = re.MULTILINE | re.DOTALL
tokens = {
'root': [
# Whitespace.
(r'\s+', Text),
(r'[,\\\[\]{}]', Punctuation),
# Push a parenthesized state so that we know the corresponding ')'
# is for a parenthesized expression and not interpolation.
(r'\(', Punctuation, ('parenthesized', 'root')),
# In this state, we don't know whether a closing ')' is for a
# parenthesized expression or the end of an interpolation. So, do
# a non-consuming match and let the parent state (either
# 'parenthesized' or 'interpolation' decide.
(r'(?=\))', Text, '#pop'),
# Keywords.
(r'(break|class|construct|else|for|foreign|if|import|in|is|'
r'return|static|super|var|while)\b', Keyword),
(r'(true|false|null)\b', Keyword.Constant),
(r'this\b', Name.Builtin),
# Comments.
(r'/\*', Comment.Multiline, 'comment'),
(r'//.*?$', Comment.Single),
# Names and operators.
(r'[~!$%^&*\-=+\\|/?<>\.:]+', Operator),
(r'[A-Z][a-zA-Z_0-9]+', Name.Variable.Global),
(r'__[a-zA-Z_0-9]+', Name.Variable.Class),
(r'_[a-zA-Z_0-9]+', Name.Variable.Instance),
(r'[a-z][a-zA-Z_0-9]+', Name),
# Numbers.
(r'\d+\.\d+([eE]-?\d+)?', Number.Float),
(r'0x[0-9a-fA-F]+', Number.Hex),
(r'\d+', Number.Integer),
# Strings.
(r'L?"', String, 'string'),
],
'comment': [
(r'/\*', Comment.Multiline, '#push'),
(r'\*/', Comment.Multiline, '#pop'),
(r'.', Comment.Multiline), # All other characters.
],
'string': [
(r'"', String, '#pop'),
(r'\\[\\%0abfnrtv"\']', String.Escape), # Escape.
(r'\\x[a-fA-F0-9]{2}', String.Escape), # Byte escape.
(r'\\u[a-fA-F0-9]{4}', String.Escape), # Unicode escape.
(r'\\U[a-fA-F0-9]{8}', String.Escape), # Long Unicode escape.
(r'%\(', String.Interpol, ('interpolation', 'root')),
(r'.', String), # All other characters.
],
'parenthesized': [
# We only get to this state when we're at a ')'.
(r'\)', Punctuation, '#pop'),
],
'interpolation': [
# We only get to this state when we're at a ')'.
(r'\)', String.Interpol, '#pop'),
],
}