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

View File

@ -328,7 +328,7 @@ constructors, etc.
## 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.
:::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
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
an overridden method when you want to access the original method being
overridden.

View File

@ -8,6 +8,13 @@
#include "wren.h"
#include <stdio.h>
#include <fcntl.h>
typedef struct sFileRequestData
{
WrenValue* fiber;
uv_buf_t buffer;
} FileRequestData;
static const int stdinDescriptor = 0;
@ -67,8 +74,12 @@ static bool handleRequestError(uv_fs_t* request)
{
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));
free(data);
uv_fs_req_cleanup(request);
free(request);
return true;
@ -78,7 +89,11 @@ static bool handleRequestError(uv_fs_t* request)
uv_fs_t* createRequest(WrenValue* fiber)
{
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;
}
@ -87,8 +102,10 @@ uv_fs_t* createRequest(WrenValue* fiber)
// Returns the fiber that should be resumed after [request] completes.
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);
free(request);
@ -111,7 +128,7 @@ void fileOpen(WrenVM* vm)
uv_fs_t* request = createRequest(wrenGetArgumentValue(vm, 2));
// 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.
@ -171,7 +188,9 @@ static void fileReadBytesCallback(uv_fs_t* request)
{
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);
// 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);
// TODO: Assert fd != -1.
uv_buf_t buffer;
buffer.len = (size_t)wrenGetArgumentDouble(vm, 1);
buffer.base = (char*)malloc(buffer.len);
FileRequestData* data = (FileRequestData*)request->data;
size_t length = (size_t)wrenGetArgumentDouble(vm, 1);
data->buffer.len = length;
data->buffer.base = (char*)malloc(length);
// 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)

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>
<PropertyGroup Label="UserMacros" />
<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>
<OutDir>$(SolutionDir)..\..\build\vs\$(Configuration)\</OutDir>
<OutDir>$(SolutionDir)..\..\lib\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\..\build\lib\$(Configuration)\</IntDir>
</PropertyGroup>
<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>
<OutDir>$(SolutionDir)..\..\build\vs\$(Configuration)\</OutDir>
<OutDir>$(SolutionDir)..\..\lib\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)..\..\build\lib\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
@ -79,24 +81,26 @@
<ClCompile Include="..\..\..\src\vm\wren_compiler.c" />
<ClCompile Include="..\..\..\src\vm\wren_core.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_utils.c" />
<ClCompile Include="..\..\..\src\vm\wren_value.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>
<ClInclude Include="..\..\..\src\include\wren.h" />
<ClInclude Include="..\..\..\src\vm\wren_common.h" />
<ClInclude Include="..\..\..\src\vm\wren_compiler.h" />
<ClInclude Include="..\..\..\src\vm\wren_core.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_utils.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\optional\wren_opt_meta.h" />
<ClInclude Include="..\..\..\src\optional\wren_opt_random.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@ -24,9 +24,6 @@
<ClCompile Include="..\..\..\src\vm\wren_debug.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_io.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_utils.c">
<Filter>Source Files</Filter>
</ClCompile>
@ -36,14 +33,20 @@
<ClCompile Include="..\..\..\src\vm\wren_vm.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\vm\wren_meta.c">
<ClCompile Include="..\..\..\src\vm\wren_primitive.c">
<Filter>Source Files</Filter>
</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>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\include\wren.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_common.h">
<Filter>Header Files</Filter>
</ClInclude>
@ -56,23 +59,26 @@
<ClInclude Include="..\..\..\src\vm\wren_debug.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_io.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_utils.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_value.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_vm.h">
<ClInclude Include="..\..\..\src\vm\wren_opcodes.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_meta.h">
<ClInclude Include="..\..\..\src\vm\wren_vm.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\vm\wren_primitive.h">
<Filter>Header Files</Filter>
</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>
</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'),
],
}