mirror of
https://github.com/janet-lang/janet
synced 2024-12-26 00:10:27 +00:00
Retab some files, delete some other files
This commit is contained in:
parent
b986e1b967
commit
18493ea076
2
.idea/interpreter.iml
generated
2
.idea/interpreter.iml
generated
@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module classpath="CMake" type="CPP_MODULE" version="4" />
|
|
4
.idea/misc.xml
generated
4
.idea/misc.xml
generated
@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
|
||||||
</project>
|
|
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/interpreter.iml" filepath="$PROJECT_DIR$/.idea/interpreter.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
215
.idea/workspace.xml
generated
215
.idea/workspace.xml
generated
@ -1,215 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CMakeRunConfigurationManager" shouldGenerate="true" buildAllGenerated="true">
|
|
||||||
<generated>
|
|
||||||
<config projectName="interpreter" targetName="interpreter" />
|
|
||||||
</generated>
|
|
||||||
</component>
|
|
||||||
<component name="CMakeSettings">
|
|
||||||
<configurations>
|
|
||||||
<configuration CONFIG_NAME="Debug" />
|
|
||||||
</configurations>
|
|
||||||
</component>
|
|
||||||
<component name="ChangeListManager">
|
|
||||||
<list default="true" id="aa7ed09b-d1cc-4d38-bb04-299b1e1504d1" name="Default" comment="">
|
|
||||||
<change type="DELETED" beforePath="$PROJECT_DIR$/parser.c" afterPath="" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/Makefile" afterPath="$PROJECT_DIR$/Makefile" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/compile.c" afterPath="$PROJECT_DIR$/compile.c" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/datatypes.h" afterPath="$PROJECT_DIR$/datatypes.h" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/dict.c" afterPath="$PROJECT_DIR$/dict.c" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/gc.c" afterPath="$PROJECT_DIR$/gc.c" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/gc.h" afterPath="$PROJECT_DIR$/gc.h" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/parse.c" afterPath="$PROJECT_DIR$/parse.c" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/util.h" afterPath="$PROJECT_DIR$/util.h" />
|
|
||||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/value.c" afterPath="$PROJECT_DIR$/value.c" />
|
|
||||||
</list>
|
|
||||||
<ignored path="$PROJECT_DIR$/cmake-build-debug/" />
|
|
||||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
|
||||||
<option name="TRACKING_ENABLED" value="true" />
|
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
||||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
||||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
||||||
</component>
|
|
||||||
<component name="CreatePatchCommitExecutor">
|
|
||||||
<option name="PATCH_PATH" value="" />
|
|
||||||
</component>
|
|
||||||
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
|
|
||||||
<component name="FileEditorManager">
|
|
||||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
|
|
||||||
<file leaf-file-name="ds.c" pinned="false" current-in-tab="true">
|
|
||||||
<entry file="file://$PROJECT_DIR$/ds.c">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state relative-caret-position="-1650">
|
|
||||||
<caret line="31" column="54" lean-forward="false" selection-start-line="31" selection-start-column="54" selection-end-line="31" selection-end-column="54" />
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</file>
|
|
||||||
</leaf>
|
|
||||||
</component>
|
|
||||||
<component name="Git.Settings">
|
|
||||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
|
||||||
</component>
|
|
||||||
<component name="IdeDocumentHistory">
|
|
||||||
<option name="CHANGED_PATHS">
|
|
||||||
<list>
|
|
||||||
<option value="$PROJECT_DIR$/ds.c" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
|
|
||||||
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
|
|
||||||
<component name="JsGulpfileManager">
|
|
||||||
<detection-done>true</detection-done>
|
|
||||||
<sorting>DEFINITION_ORDER</sorting>
|
|
||||||
</component>
|
|
||||||
<component name="ProjectFrameBounds">
|
|
||||||
<option name="y" value="26" />
|
|
||||||
<option name="width" value="1920" />
|
|
||||||
<option name="height" value="1054" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectLevelVcsManager">
|
|
||||||
<ConfirmationsSetting value="2" id="Add" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectView">
|
|
||||||
<navigator currentView="ProjectPane" proportions="" version="1">
|
|
||||||
<flattenPackages />
|
|
||||||
<showMembers />
|
|
||||||
<showModules />
|
|
||||||
<showLibraryContents />
|
|
||||||
<hideEmptyPackages />
|
|
||||||
<abbreviatePackageNames />
|
|
||||||
<autoscrollToSource />
|
|
||||||
<autoscrollFromSource />
|
|
||||||
<sortByType />
|
|
||||||
<manualOrder />
|
|
||||||
<foldersAlwaysOnTop value="true" />
|
|
||||||
</navigator>
|
|
||||||
<panes>
|
|
||||||
<pane id="ProjectPane">
|
|
||||||
<subPane>
|
|
||||||
<PATH>
|
|
||||||
<PATH_ELEMENT>
|
|
||||||
<option name="myItemId" value="interpreter" />
|
|
||||||
<option name="myItemType" value="com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1" />
|
|
||||||
</PATH_ELEMENT>
|
|
||||||
<PATH_ELEMENT>
|
|
||||||
<option name="myItemId" value="interpreter" />
|
|
||||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
||||||
</PATH_ELEMENT>
|
|
||||||
</PATH>
|
|
||||||
</subPane>
|
|
||||||
</pane>
|
|
||||||
</panes>
|
|
||||||
</component>
|
|
||||||
<component name="PropertiesComponent">
|
|
||||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
|
||||||
</component>
|
|
||||||
<component name="RunManager" selected="Application.Build All">
|
|
||||||
<configuration default="true" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="interpreter" TARGET_NAME="interpreter" CONFIG_NAME="Debug">
|
|
||||||
<envs />
|
|
||||||
<method />
|
|
||||||
</configuration>
|
|
||||||
<configuration default="false" name="interpreter" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="interpreter" TARGET_NAME="interpreter" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="interpreter" RUN_TARGET_NAME="interpreter">
|
|
||||||
<envs />
|
|
||||||
<method />
|
|
||||||
</configuration>
|
|
||||||
<configuration default="false" name="Build All" type="CMakeRunConfiguration" factoryName="Application" WORKING_DIR="" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="interpreter" RUN_TARGET_NAME="interpreter" EXPLICIT_BUILD_TARGET_NAME="all">
|
|
||||||
<envs />
|
|
||||||
<method />
|
|
||||||
</configuration>
|
|
||||||
<list size="2">
|
|
||||||
<item index="0" class="java.lang.String" itemvalue="Application.interpreter" />
|
|
||||||
<item index="1" class="java.lang.String" itemvalue="Application.Build All" />
|
|
||||||
</list>
|
|
||||||
</component>
|
|
||||||
<component name="ShelveChangesManager" show_recycled="false">
|
|
||||||
<option name="remove_strategy" value="false" />
|
|
||||||
</component>
|
|
||||||
<component name="TaskManager">
|
|
||||||
<task active="true" id="Default" summary="Default task">
|
|
||||||
<changelist id="aa7ed09b-d1cc-4d38-bb04-299b1e1504d1" name="Default" comment="" />
|
|
||||||
<created>1487818367037</created>
|
|
||||||
<option name="number" value="Default" />
|
|
||||||
<option name="presentableId" value="Default" />
|
|
||||||
<updated>1487818367037</updated>
|
|
||||||
<workItem from="1487818369430" duration="237000" />
|
|
||||||
<workItem from="1488661961803" duration="14000" />
|
|
||||||
</task>
|
|
||||||
<servers />
|
|
||||||
</component>
|
|
||||||
<component name="TimeTrackingManager">
|
|
||||||
<option name="totallyTimeSpent" value="251000" />
|
|
||||||
</component>
|
|
||||||
<component name="ToolWindowManager">
|
|
||||||
<frame x="0" y="26" width="1920" height="1054" extended-state="6" />
|
|
||||||
<editor active="false" />
|
|
||||||
<layout>
|
|
||||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.18177083" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
|
||||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="CMake" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32984293" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="LuaJ" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
|
|
||||||
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
|
|
||||||
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.24816754" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32984293" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
|
|
||||||
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
|
||||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
|
||||||
</layout>
|
|
||||||
</component>
|
|
||||||
<component name="TypeScriptGeneratedFilesManager">
|
|
||||||
<option name="processedProjectFiles" value="true" />
|
|
||||||
</component>
|
|
||||||
<component name="VcsContentAnnotationSettings">
|
|
||||||
<option name="myLimit" value="2678400000" />
|
|
||||||
</component>
|
|
||||||
<component name="XDebuggerManager">
|
|
||||||
<breakpoint-manager />
|
|
||||||
<watches-manager />
|
|
||||||
</component>
|
|
||||||
<component name="editorHistoryManager">
|
|
||||||
<entry file="file://$PROJECT_DIR$/CMakeLists.txt">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state relative-caret-position="45">
|
|
||||||
<caret line="3" column="13" lean-forward="false" selection-start-line="3" selection-start-column="13" selection-end-line="3" selection-end-column="13" />
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
<entry file="file://$PROJECT_DIR$/ds.c">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state relative-caret-position="0">
|
|
||||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
<entry file="file://$PROJECT_DIR$/CMakeLists.txt">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state relative-caret-position="45">
|
|
||||||
<caret line="3" column="13" lean-forward="false" selection-start-line="3" selection-start-column="13" selection-end-line="3" selection-end-column="13" />
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
<entry file="file://$PROJECT_DIR$/ds.c">
|
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
|
||||||
<state relative-caret-position="-1650">
|
|
||||||
<caret line="31" column="54" lean-forward="false" selection-start-line="31" selection-start-column="54" selection-end-line="31" selection-end-column="54" />
|
|
||||||
<folding />
|
|
||||||
</state>
|
|
||||||
</provider>
|
|
||||||
</entry>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
68
compile.c
68
compile.c
@ -495,7 +495,7 @@ static Slot compile_operator(GstCompiler *c, FormOptions opts, GstValue *form,
|
|||||||
uint32_t count = gst_tuple_length(form);
|
uint32_t count = gst_tuple_length(form);
|
||||||
/* Check for some early exit conditions */
|
/* Check for some early exit conditions */
|
||||||
if (count == 2 && (flags & OP_1_REPEAT)) {
|
if (count == 2 && (flags & OP_1_REPEAT)) {
|
||||||
return compile_value(c, opts, form[1]);
|
return compile_value(c, opts, form[1]);
|
||||||
}
|
}
|
||||||
if (opts.resultUnused) {
|
if (opts.resultUnused) {
|
||||||
ret = nil_slot();
|
ret = nil_slot();
|
||||||
@ -550,8 +550,8 @@ static Slot compile_operator(GstCompiler *c, FormOptions opts, GstValue *form,
|
|||||||
uint32_t i;
|
uint32_t i;
|
||||||
FormOptions subOpts = form_options_default();
|
FormOptions subOpts = form_options_default();
|
||||||
Slot lhs = compile_value(c, subOpts, form[1]);
|
Slot lhs = compile_value(c, subOpts, form[1]);
|
||||||
Slot rhs = compile_value(c, subOpts, form[2]);
|
Slot rhs = compile_value(c, subOpts, form[2]);
|
||||||
gst_buffer_push_u16(c->vm, buffer, op2);
|
gst_buffer_push_u16(c->vm, buffer, op2);
|
||||||
gst_buffer_push_u16(c->vm, buffer, ret.index);
|
gst_buffer_push_u16(c->vm, buffer, ret.index);
|
||||||
gst_buffer_push_u16(c->vm, buffer, lhs.index);
|
gst_buffer_push_u16(c->vm, buffer, lhs.index);
|
||||||
gst_buffer_push_u16(c->vm, buffer, rhs.index);
|
gst_buffer_push_u16(c->vm, buffer, rhs.index);
|
||||||
@ -559,7 +559,7 @@ static Slot compile_operator(GstCompiler *c, FormOptions opts, GstValue *form,
|
|||||||
compiler_drop_slot(c, scope, rhs);
|
compiler_drop_slot(c, scope, rhs);
|
||||||
for (i = 3; i < count; ++i) {
|
for (i = 3; i < count; ++i) {
|
||||||
rhs = compile_value(c, subOpts, form[i]);
|
rhs = compile_value(c, subOpts, form[i]);
|
||||||
gst_buffer_push_u16(c->vm, buffer, op2);
|
gst_buffer_push_u16(c->vm, buffer, op2);
|
||||||
gst_buffer_push_u16(c->vm, buffer, ret.index);
|
gst_buffer_push_u16(c->vm, buffer, ret.index);
|
||||||
gst_buffer_push_u16(c->vm, buffer, ret.index);
|
gst_buffer_push_u16(c->vm, buffer, ret.index);
|
||||||
gst_buffer_push_u16(c->vm, buffer, rhs.index);
|
gst_buffer_push_u16(c->vm, buffer, rhs.index);
|
||||||
@ -582,7 +582,7 @@ static Slot compile_operator(GstCompiler *c, FormOptions opts, GstValue *form,
|
|||||||
/* Quickly define some specials */
|
/* Quickly define some specials */
|
||||||
#define MAKE_SPECIAL(name, op0, op1, op2, opn, flags) \
|
#define MAKE_SPECIAL(name, op0, op1, op2, opn, flags) \
|
||||||
static Slot compile_##name (GstCompiler *c, FormOptions opts, GstValue *form) {\
|
static Slot compile_##name (GstCompiler *c, FormOptions opts, GstValue *form) {\
|
||||||
return compile_operator(c, opts, form, (op0), (op1), (op2), (opn), (flags));\
|
return compile_operator(c, opts, form, (op0), (op1), (op2), (opn), (flags));\
|
||||||
}
|
}
|
||||||
|
|
||||||
MAKE_SPECIAL(addition, 0, -1, GST_OP_ADD, -1, OP_FOLD | OP_DEFAULT_INT | OP_1_REPEAT)
|
MAKE_SPECIAL(addition, 0, -1, GST_OP_ADD, -1, OP_FOLD | OP_DEFAULT_INT | OP_1_REPEAT)
|
||||||
@ -615,18 +615,18 @@ static Slot compile_set(GstCompiler *c, FormOptions opts, GstValue *form) {
|
|||||||
subOpts = form_options_default();
|
subOpts = form_options_default();
|
||||||
}
|
}
|
||||||
key = compiler_realize_slot(c, compile_value(c, subOpts, form[2]));
|
key = compiler_realize_slot(c, compile_value(c, subOpts, form[2]));
|
||||||
val = compiler_realize_slot(c, compile_value(c, subOpts, form[3]));
|
val = compiler_realize_slot(c, compile_value(c, subOpts, form[3]));
|
||||||
gst_buffer_push_u16(c->vm, buffer, GST_OP_SET);
|
gst_buffer_push_u16(c->vm, buffer, GST_OP_SET);
|
||||||
gst_buffer_push_u16(c->vm, buffer, ds.index);
|
gst_buffer_push_u16(c->vm, buffer, ds.index);
|
||||||
gst_buffer_push_u16(c->vm, buffer, key.index);
|
gst_buffer_push_u16(c->vm, buffer, key.index);
|
||||||
gst_buffer_push_u16(c->vm, buffer, val.index);
|
gst_buffer_push_u16(c->vm, buffer, val.index);
|
||||||
compiler_drop_slot(c, c->tail, key);
|
compiler_drop_slot(c, c->tail, key);
|
||||||
compiler_drop_slot(c, c->tail, val);
|
compiler_drop_slot(c, c->tail, val);
|
||||||
if (opts.resultUnused) {
|
if (opts.resultUnused) {
|
||||||
compiler_drop_slot(c, c->tail, ds);
|
compiler_drop_slot(c, c->tail, ds);
|
||||||
return nil_slot();
|
return nil_slot();
|
||||||
} else {
|
} else {
|
||||||
return ds;
|
return ds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -881,8 +881,8 @@ static Slot compile_try(GstCompiler *c, FormOptions opts, GstValue *form) {
|
|||||||
/* Add subscope for error variable */
|
/* Add subscope for error variable */
|
||||||
GstScope *subScope = compiler_push_scope(c, 1);
|
GstScope *subScope = compiler_push_scope(c, 1);
|
||||||
errorIndex = compiler_declare_symbol(c, subScope, form[1]);
|
errorIndex = compiler_declare_symbol(c, subScope, form[1]);
|
||||||
/* Leave space for try instruction */
|
/* Leave space for try instruction */
|
||||||
countAtTry = buffer->count;
|
countAtTry = buffer->count;
|
||||||
buffer->count += sizeof(uint32_t) + 2 * sizeof(uint16_t);
|
buffer->count += sizeof(uint32_t) + 2 * sizeof(uint16_t);
|
||||||
/* Compile the body */
|
/* Compile the body */
|
||||||
body = compile_value(c, opts, form[2]);
|
body = compile_value(c, opts, form[2]);
|
||||||
@ -1052,23 +1052,23 @@ static SpecialFormHelper get_special(GstValue *form) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
{
|
{
|
||||||
if (gst_string_length(name) == 5 &&
|
if (gst_string_length(name) == 5 &&
|
||||||
name[1] == 'r' &&
|
name[1] == 'r' &&
|
||||||
name[2] == 'r' &&
|
name[2] == 'r' &&
|
||||||
name[3] == 'o' &&
|
name[3] == 'o' &&
|
||||||
name[4] == 'r') {
|
name[4] == 'r') {
|
||||||
return compile_error;
|
return compile_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 'g':
|
case 'g':
|
||||||
{
|
{
|
||||||
if (gst_string_length(name) == 3 &&
|
if (gst_string_length(name) == 3 &&
|
||||||
name[1] == 'e' &&
|
name[1] == 'e' &&
|
||||||
name[2] == 't') {
|
name[2] == 't') {
|
||||||
return compile_get;
|
return compile_get;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 'd':
|
case 'd':
|
||||||
{
|
{
|
||||||
@ -1102,7 +1102,7 @@ static SpecialFormHelper get_special(GstValue *form) {
|
|||||||
return compile_not;
|
return compile_not;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
{
|
{
|
||||||
if (gst_string_length(name) == 5 &&
|
if (gst_string_length(name) == 5 &&
|
||||||
@ -1134,7 +1134,7 @@ static SpecialFormHelper get_special(GstValue *form) {
|
|||||||
name[2] == 'p' &&
|
name[2] == 'p' &&
|
||||||
name[3] == 'l' &&
|
name[3] == 'l' &&
|
||||||
name[4] == 'e') {
|
name[4] == 'e') {
|
||||||
return compile_make_tuple;
|
return compile_make_tuple;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 'w':
|
case 'w':
|
||||||
@ -1198,14 +1198,14 @@ static Slot compile_object(GstCompiler *c, FormOptions opts, GstObject *obj) {
|
|||||||
ret = compiler_get_target(c, opts);
|
ret = compiler_get_target(c, opts);
|
||||||
tracker_init(c, &tracker);
|
tracker_init(c, &tracker);
|
||||||
for (i = 0; i < cap; ++i) {
|
for (i = 0; i < cap; ++i) {
|
||||||
bucket = obj->buckets[i];
|
bucket = obj->buckets[i];
|
||||||
while (bucket != NULL) {
|
while (bucket != NULL) {
|
||||||
Slot slot = compile_value(c, subOpts, bucket->key);
|
Slot slot = compile_value(c, subOpts, bucket->key);
|
||||||
compiler_tracker_push(c, &tracker, compiler_realize_slot(c, slot));
|
compiler_tracker_push(c, &tracker, compiler_realize_slot(c, slot));
|
||||||
slot = compile_value(c, subOpts, bucket->value);
|
slot = compile_value(c, subOpts, bucket->value);
|
||||||
compiler_tracker_push(c, &tracker, compiler_realize_slot(c, slot));
|
compiler_tracker_push(c, &tracker, compiler_realize_slot(c, slot));
|
||||||
bucket = bucket->next;
|
bucket = bucket->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compiler_tracker_free(c, scope, &tracker);
|
compiler_tracker_free(c, scope, &tracker);
|
||||||
gst_buffer_push_u16(c->vm, buffer, GST_OP_DIC);
|
gst_buffer_push_u16(c->vm, buffer, GST_OP_DIC);
|
||||||
@ -1335,10 +1335,10 @@ GstFunction *gst_compiler_compile(GstCompiler *c, GstValue form) {
|
|||||||
GstFuncEnv *env = gst_alloc(c->vm, sizeof(GstFuncEnv));
|
GstFuncEnv *env = gst_alloc(c->vm, sizeof(GstFuncEnv));
|
||||||
GstFunction *func = gst_alloc(c->vm, sizeof(GstFunction));
|
GstFunction *func = gst_alloc(c->vm, sizeof(GstFunction));
|
||||||
if (envSize) {
|
if (envSize) {
|
||||||
env->values = gst_alloc(c->vm, sizeof(GstValue) * envSize);
|
env->values = gst_alloc(c->vm, sizeof(GstValue) * envSize);
|
||||||
gst_memcpy(env->values, c->env->data, envSize * sizeof(GstValue));
|
gst_memcpy(env->values, c->env->data, envSize * sizeof(GstValue));
|
||||||
} else {
|
} else {
|
||||||
env->values = NULL;
|
env->values = NULL;
|
||||||
}
|
}
|
||||||
env->stackOffset = envSize;
|
env->stackOffset = envSize;
|
||||||
env->thread = NULL;
|
env->thread = NULL;
|
||||||
|
26
datatypes.h
26
datatypes.h
@ -74,14 +74,14 @@ struct GstValue {
|
|||||||
/* A lightweight thread in gst. Does not correspond to
|
/* A lightweight thread in gst. Does not correspond to
|
||||||
* operating system threads. Used in coroutines. */
|
* operating system threads. Used in coroutines. */
|
||||||
struct GstThread {
|
struct GstThread {
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
uint32_t capacity;
|
uint32_t capacity;
|
||||||
GstValue *data;
|
GstValue *data;
|
||||||
enum {
|
enum {
|
||||||
GST_THREAD_PENDING = 0,
|
GST_THREAD_PENDING = 0,
|
||||||
GST_THREAD_ALIVE,
|
GST_THREAD_ALIVE,
|
||||||
GST_TRHEAD_DEAD
|
GST_TRHEAD_DEAD
|
||||||
} status;
|
} status;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A dynamic array type. Useful for implementing a stack. */
|
/* A dynamic array type. Useful for implementing a stack. */
|
||||||
@ -147,8 +147,8 @@ struct GstBucket {
|
|||||||
|
|
||||||
/* Contains information about userdata */
|
/* Contains information about userdata */
|
||||||
struct GstUserdataHeader {
|
struct GstUserdataHeader {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
GstObject *meta;
|
GstObject *meta;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* VM return status from c function */
|
/* VM return status from c function */
|
||||||
@ -206,9 +206,9 @@ enum GstOpCode {
|
|||||||
GST_OP_TUP, /* Create tuple */
|
GST_OP_TUP, /* Create tuple */
|
||||||
GST_OP_SET, /* Assocaitive set */
|
GST_OP_SET, /* Assocaitive set */
|
||||||
GST_OP_GET, /* Associative get */
|
GST_OP_GET, /* Associative get */
|
||||||
GST_OP_ERR, /* Throw error */
|
GST_OP_ERR, /* Throw error */
|
||||||
GST_OP_TRY, /* Begin try block */
|
GST_OP_TRY, /* Begin try block */
|
||||||
GST_OP_UTY, /* End try block */
|
GST_OP_UTY, /* End try block */
|
||||||
GST_OP_RET, /* Return from function */
|
GST_OP_RET, /* Return from function */
|
||||||
GST_OP_RTN, /* Return nil */
|
GST_OP_RTN, /* Return nil */
|
||||||
GST_OP_PSH, /* Push a stack frame */
|
GST_OP_PSH, /* Push a stack frame */
|
||||||
|
6
disasm.c
6
disasm.c
@ -76,10 +76,10 @@ void gst_dasm(FILE * out, uint16_t *byteCode, uint32_t len) {
|
|||||||
break;
|
break;
|
||||||
case GST_OP_SUB:
|
case GST_OP_SUB:
|
||||||
current += dasm_fixed_op(out, current, "sub", 3);
|
current += dasm_fixed_op(out, current, "sub", 3);
|
||||||
break;
|
break;
|
||||||
case GST_OP_MUL:
|
case GST_OP_MUL:
|
||||||
current += dasm_fixed_op(out, current, "mul", 3);
|
current += dasm_fixed_op(out, current, "mul", 3);
|
||||||
break;
|
break;
|
||||||
case GST_OP_DIV:
|
case GST_OP_DIV:
|
||||||
current += dasm_fixed_op(out, current, "div", 3);
|
current += dasm_fixed_op(out, current, "div", 3);
|
||||||
break;
|
break;
|
||||||
@ -194,7 +194,7 @@ void gst_dasm(FILE * out, uint16_t *byteCode, uint32_t len) {
|
|||||||
current += dasm_fixed_op(out, current, "returnNil", 0);
|
current += dasm_fixed_op(out, current, "returnNil", 0);
|
||||||
break;
|
break;
|
||||||
case GST_OP_PSH:
|
case GST_OP_PSH:
|
||||||
current += dasm_varg_op(out, current, "push", 1);
|
current += dasm_varg_op(out, current, "push", 1);
|
||||||
break;
|
break;
|
||||||
case GST_OP_CAL:
|
case GST_OP_CAL:
|
||||||
current += dasm_fixed_op(out, current, "call", 1);
|
current += dasm_fixed_op(out, current, "call", 1);
|
||||||
|
62
ds.c
62
ds.c
@ -149,11 +149,11 @@ GstValue gst_array_peek(GstArray *array) {
|
|||||||
/* Create a new emoty tuple of the given size. Expected to be
|
/* Create a new emoty tuple of the given size. Expected to be
|
||||||
* mutated immediately */
|
* mutated immediately */
|
||||||
GstValue *gst_tuple(Gst *vm, uint32_t length) {
|
GstValue *gst_tuple(Gst *vm, uint32_t length) {
|
||||||
char *data = gst_alloc(vm, 2 * sizeof(uint32_t) + length * sizeof(GstValue));
|
char *data = gst_alloc(vm, 2 * sizeof(uint32_t) + length * sizeof(GstValue));
|
||||||
GstValue *tuple = (GstValue *)(data + (2 * sizeof(uint32_t)));
|
GstValue *tuple = (GstValue *)(data + (2 * sizeof(uint32_t)));
|
||||||
gst_tuple_length(tuple) = length;
|
gst_tuple_length(tuple) = length;
|
||||||
gst_tuple_hash(tuple) = 0;
|
gst_tuple_hash(tuple) = 0;
|
||||||
return tuple;
|
return tuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****/
|
/****/
|
||||||
@ -162,12 +162,12 @@ GstValue *gst_tuple(Gst *vm, uint32_t length) {
|
|||||||
|
|
||||||
/* Create new userdata */
|
/* Create new userdata */
|
||||||
void *gst_userdata(Gst *vm, uint32_t size, GstObject *meta) {
|
void *gst_userdata(Gst *vm, uint32_t size, GstObject *meta) {
|
||||||
char *data = gst_alloc(vm, sizeof(GstUserdataHeader) + size);
|
char *data = gst_alloc(vm, sizeof(GstUserdataHeader) + size);
|
||||||
GstUserdataHeader *header = (GstUserdataHeader *)data;
|
GstUserdataHeader *header = (GstUserdataHeader *)data;
|
||||||
void *user = data + sizeof(GstUserdataHeader);
|
void *user = data + sizeof(GstUserdataHeader);
|
||||||
header->size = size;
|
header->size = size;
|
||||||
header->meta = meta;
|
header->meta = meta;
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****/
|
/****/
|
||||||
@ -231,34 +231,34 @@ GstValue gst_object_get(GstObject *o, GstValue key) {
|
|||||||
/* Get a value of the object with a cstring key */
|
/* Get a value of the object with a cstring key */
|
||||||
GstValue gst_object_get_cstring(GstObject *obj, const char *key) {
|
GstValue gst_object_get_cstring(GstObject *obj, const char *key) {
|
||||||
const char *end = key;
|
const char *end = key;
|
||||||
while (*end++);
|
while (*end++);
|
||||||
uint32_t len = end - key;
|
uint32_t len = end - key;
|
||||||
uint32_t hash = gst_cstring_calchash((uint8_t *)key, len);
|
uint32_t hash = gst_cstring_calchash((uint8_t *)key, len);
|
||||||
uint32_t index = hash % obj->capacity;
|
uint32_t index = hash % obj->capacity;
|
||||||
GstBucket *bucket = obj->buckets[index];
|
GstBucket *bucket = obj->buckets[index];
|
||||||
while (bucket) {
|
while (bucket) {
|
||||||
if (bucket->key.type == GST_STRING) {
|
if (bucket->key.type == GST_STRING) {
|
||||||
uint8_t *s = bucket->key.data.string;
|
uint8_t *s = bucket->key.data.string;
|
||||||
if (gst_string_length(s) == len) {
|
if (gst_string_length(s) == len) {
|
||||||
if (!gst_string_hash(s))
|
if (!gst_string_hash(s))
|
||||||
gst_string_hash(s) = gst_string_calchash(s);
|
gst_string_hash(s) = gst_string_calchash(s);
|
||||||
if (gst_string_hash(s) == hash) {
|
if (gst_string_hash(s) == hash) {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
for (i = 0; i < len; ++i)
|
for (i = 0; i < len; ++i)
|
||||||
if (s[i] != key[i])
|
if (s[i] != key[i])
|
||||||
goto notequal;
|
goto notequal;
|
||||||
return bucket->value;
|
return bucket->value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
notequal:
|
notequal:
|
||||||
bucket = bucket->next;
|
bucket = bucket->next;
|
||||||
}
|
}
|
||||||
/* Return nil */
|
/* Return nil */
|
||||||
{
|
{
|
||||||
GstValue ret;
|
GstValue ret;
|
||||||
ret.type = GST_NIL;
|
ret.type = GST_NIL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
# Some basic macros
|
|
||||||
|
|
||||||
(defmacro for [bindings ...]
|
|
||||||
|
|
||||||
)
|
|
48
parse.c
48
parse.c
@ -20,13 +20,13 @@ struct GstParseState {
|
|||||||
ParseType type;
|
ParseType type;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
uint8_t endDelimiter;
|
uint8_t endDelimiter;
|
||||||
GstArray *array;
|
GstArray *array;
|
||||||
} form;
|
} form;
|
||||||
struct {
|
struct {
|
||||||
GstValue key;
|
GstValue key;
|
||||||
int keyFound;
|
int keyFound;
|
||||||
GstObject *object;
|
GstObject *object;
|
||||||
} object;
|
} object;
|
||||||
struct {
|
struct {
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
@ -362,22 +362,22 @@ static int form_state(GstParser *p, uint8_t c) {
|
|||||||
x.type = GST_ARRAY;
|
x.type = GST_ARRAY;
|
||||||
x.data.array = array;
|
x.data.array = array;
|
||||||
} else if (c == ')') {
|
} else if (c == ')') {
|
||||||
x.type = GST_TUPLE;
|
x.type = GST_TUPLE;
|
||||||
x.data.tuple = gst_tuple(p->vm, array->count);
|
x.data.tuple = gst_tuple(p->vm, array->count);
|
||||||
gst_memcpy(x.data.tuple, array->data, array->count * sizeof(GstValue));
|
gst_memcpy(x.data.tuple, array->data, array->count * sizeof(GstValue));
|
||||||
} else { /* c == '{' */
|
} else { /* c == '{' */
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
if (array->count % 2 != 0) {
|
if (array->count % 2 != 0) {
|
||||||
p_error(p, "object literal must have even number of elements");
|
p_error(p, "object literal must have even number of elements");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
x.type = GST_OBJECT;
|
x.type = GST_OBJECT;
|
||||||
x.data.object = gst_object(p->vm, array->count);
|
x.data.object = gst_object(p->vm, array->count);
|
||||||
for (i = 0; i < array->count; i += 2) {
|
for (i = 0; i < array->count; i += 2) {
|
||||||
gst_object_put(p->vm, x.data.object, array->data[i], array->data[i + 1]);
|
gst_object_put(p->vm, x.data.object, array->data[i], array->data[i + 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parser_pop(p);
|
parser_pop(p);
|
||||||
parser_append(p, x);
|
parser_append(p, x);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -392,17 +392,17 @@ static void dispatch_char(GstParser *p, uint8_t c) {
|
|||||||
/* Handle comments */
|
/* Handle comments */
|
||||||
if (p->flags & GST_PARSER_FLAG_INCOMMENT) {
|
if (p->flags & GST_PARSER_FLAG_INCOMMENT) {
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
p->flags = GST_PARSER_FLAG_EXPECTING_COMMENT;
|
p->flags = GST_PARSER_FLAG_EXPECTING_COMMENT;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else if (p->flags & GST_PARSER_FLAG_EXPECTING_COMMENT) {
|
} else if (p->flags & GST_PARSER_FLAG_EXPECTING_COMMENT) {
|
||||||
if (c == '#') {
|
if (c == '#') {
|
||||||
p->flags = GST_PARSER_FLAG_INCOMMENT;
|
p->flags = GST_PARSER_FLAG_INCOMMENT;
|
||||||
return;
|
return;
|
||||||
} else if (!is_whitespace(c)) {
|
} else if (!is_whitespace(c)) {
|
||||||
p->flags = 0;
|
p->flags = 0;
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,10 +443,10 @@ int gst_parse_cstring(GstParser *p, const char *string) {
|
|||||||
int gst_parse_string(GstParser *p, uint8_t *string) {
|
int gst_parse_string(GstParser *p, uint8_t *string) {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
p->status = GST_PARSER_PENDING;
|
p->status = GST_PARSER_PENDING;
|
||||||
for (i = 0; i < gst_string_length(string); ++i) {
|
for (i = 0; i < gst_string_length(string); ++i) {
|
||||||
if (p->status != GST_PARSER_PENDING) break;
|
if (p->status != GST_PARSER_PENDING) break;
|
||||||
dispatch_char(p, string[i]);
|
dispatch_char(p, string[i]);
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
82
stl.c
82
stl.c
@ -24,41 +24,41 @@ int gst_stl_print(Gst *vm) {
|
|||||||
|
|
||||||
/* Get class value */
|
/* Get class value */
|
||||||
int gst_stl_getclass(Gst *vm) {
|
int gst_stl_getclass(Gst *vm) {
|
||||||
GstValue class = gst_get_class(gst_arg(vm, 0));
|
GstValue class = gst_get_class(gst_arg(vm, 0));
|
||||||
gst_c_return(vm, class);
|
gst_c_return(vm, class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set class value */
|
/* Set class value */
|
||||||
int gst_stl_setclass(Gst *vm) {
|
int gst_stl_setclass(Gst *vm) {
|
||||||
GstValue x = gst_arg(vm, 0);
|
GstValue x = gst_arg(vm, 0);
|
||||||
GstValue class = gst_arg(vm, 1);
|
GstValue class = gst_arg(vm, 1);
|
||||||
const char *err = gst_set_class(x, class);
|
const char *err = gst_set_class(x, class);
|
||||||
if (err != NULL)
|
if (err != NULL)
|
||||||
gst_c_throwc(vm, err);
|
gst_c_throwc(vm, err);
|
||||||
gst_c_return(vm, x);
|
gst_c_return(vm, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call a function */
|
/* Call a function */
|
||||||
int gst_stl_callforeach(Gst *vm) {
|
int gst_stl_callforeach(Gst *vm) {
|
||||||
GstValue func = gst_arg(vm, 0);
|
GstValue func = gst_arg(vm, 0);
|
||||||
uint32_t argCount = gst_count_args(vm);
|
uint32_t argCount = gst_count_args(vm);
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
if (argCount) {
|
if (argCount) {
|
||||||
for (i = 0; i < argCount - 1; ++i)
|
for (i = 0; i < argCount - 1; ++i)
|
||||||
gst_call(vm, func, 1, vm->thread->data + vm->thread->count + 1 + i);
|
gst_call(vm, func, 1, vm->thread->data + vm->thread->count + 1 + i);
|
||||||
return GST_RETURN_OK;
|
return GST_RETURN_OK;
|
||||||
} else {
|
} else {
|
||||||
gst_c_throwc(vm, "expected at least one argument");
|
gst_c_throwc(vm, "expected at least one argument");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Exit */
|
/* Exit */
|
||||||
int gst_stl_exit(Gst *vm) {
|
int gst_stl_exit(Gst *vm) {
|
||||||
int ret;
|
int ret;
|
||||||
GstValue exitValue = gst_arg(vm, 0);
|
GstValue exitValue = gst_arg(vm, 0);
|
||||||
ret = (exitValue.type == GST_NUMBER) ? exitValue.data.number : 0;
|
ret = (exitValue.type == GST_NUMBER) ? exitValue.data.number : 0;
|
||||||
exit(ret);
|
exit(ret);
|
||||||
return GST_RETURN_OK;
|
return GST_RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load core */
|
/* Load core */
|
||||||
@ -76,25 +76,25 @@ void gst_stl_load_core(GstCompiler *c) {
|
|||||||
|
|
||||||
/* Parse a source string into an AST */
|
/* Parse a source string into an AST */
|
||||||
int gst_stl_parse(Gst *vm) {
|
int gst_stl_parse(Gst *vm) {
|
||||||
uint8_t *source = gst_to_string(vm, gst_arg(vm, 0));
|
uint8_t *source = gst_to_string(vm, gst_arg(vm, 0));
|
||||||
GstParser p;
|
GstParser p;
|
||||||
/* init state */
|
/* init state */
|
||||||
gst_parser(&p, vm);
|
gst_parser(&p, vm);
|
||||||
|
|
||||||
/* Get and parse input until we have a full form */
|
/* Get and parse input until we have a full form */
|
||||||
gst_parse_string(&p, source);
|
gst_parse_string(&p, source);
|
||||||
if (p.status == GST_PARSER_PENDING) {
|
if (p.status == GST_PARSER_PENDING) {
|
||||||
gst_c_throwc(vm, "incomplete source");
|
gst_c_throwc(vm, "incomplete source");
|
||||||
} else if (p.status == GST_PARSER_ERROR) {
|
} else if (p.status == GST_PARSER_ERROR) {
|
||||||
gst_c_throwc(vm, p.error);
|
gst_c_throwc(vm, p.error);
|
||||||
} else {
|
} else {
|
||||||
gst_c_return(vm, p.value);
|
gst_c_return(vm, p.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load parsing */
|
/* Load parsing */
|
||||||
void gst_stl_load_parse(GstCompiler *c) {
|
void gst_stl_load_parse(GstCompiler *c) {
|
||||||
gst_compiler_add_global_cfunction(c, "parse", gst_stl_parse);
|
gst_compiler_add_global_cfunction(c, "parse", gst_stl_parse);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****/
|
/****/
|
||||||
@ -110,25 +110,25 @@ int gst_stl_compile(Gst *vm) {
|
|||||||
/* init state */
|
/* init state */
|
||||||
gst_compiler(&c, vm);
|
gst_compiler(&c, vm);
|
||||||
/* Check for environment variables */
|
/* Check for environment variables */
|
||||||
if (env.type == GST_OBJECT) {
|
if (env.type == GST_OBJECT) {
|
||||||
/* Iterate through environment, adding globals */
|
/* Iterate through environment, adding globals */
|
||||||
} else if (env.type != GST_NIL) {
|
} else if (env.type != GST_NIL) {
|
||||||
gst_c_throwc(vm, "invalid type for environment");
|
gst_c_throwc(vm, "invalid type for environment");
|
||||||
}
|
}
|
||||||
/* Prepare return value */
|
/* Prepare return value */
|
||||||
ret.type = GST_FUNCTION;
|
ret.type = GST_FUNCTION;
|
||||||
ret.data.function = gst_compiler_compile(&c, ast);
|
ret.data.function = gst_compiler_compile(&c, ast);
|
||||||
/* Check for errors */
|
/* Check for errors */
|
||||||
if (c.error == NULL) {
|
if (c.error == NULL) {
|
||||||
gst_c_return(vm, ret);
|
gst_c_return(vm, ret);
|
||||||
} else {
|
} else {
|
||||||
gst_c_throwc(vm, c.error);
|
gst_c_throwc(vm, c.error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load compilation */
|
/* Load compilation */
|
||||||
void gst_stl_load_compile(GstCompiler *c) {
|
void gst_stl_load_compile(GstCompiler *c) {
|
||||||
gst_compiler_add_global_cfunction(c, "compile", gst_stl_compile);
|
gst_compiler_add_global_cfunction(c, "compile", gst_stl_compile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****/
|
/****/
|
||||||
@ -143,7 +143,7 @@ void gst_stl_load_compile(GstCompiler *c) {
|
|||||||
|
|
||||||
/* Load all libraries */
|
/* Load all libraries */
|
||||||
void gst_stl_load(GstCompiler *c) {
|
void gst_stl_load(GstCompiler *c) {
|
||||||
gst_stl_load_core(c);
|
gst_stl_load_core(c);
|
||||||
gst_stl_load_parse(c);
|
gst_stl_load_parse(c);
|
||||||
gst_stl_load_compile(c);
|
gst_stl_load_compile(c);
|
||||||
}
|
}
|
||||||
|
10
temp.script
10
temp.script
@ -1,10 +0,0 @@
|
|||||||
(do
|
|
||||||
|
|
||||||
(:= fib (fn (n)
|
|
||||||
(if (< n 2)
|
|
||||||
1
|
|
||||||
(+ (fib (- n 1)) (fib (- n 2))))))
|
|
||||||
|
|
||||||
(print 10)
|
|
||||||
(print (fib 33))
|
|
||||||
)
|
|
4
util.h
4
util.h
@ -52,8 +52,8 @@
|
|||||||
#define GST_FRAME_SIZE 5
|
#define GST_FRAME_SIZE 5
|
||||||
|
|
||||||
/* Macros for referencing that a stack frame given a stack */
|
/* Macros for referencing that a stack frame given a stack */
|
||||||
#define gst_frame_callee(s) (*(s - 1))
|
#define gst_frame_callee(s) (*(s - 1))
|
||||||
#define gst_frame_size(s) ((s - 2)->data.hws[0])
|
#define gst_frame_size(s) ((s - 2)->data.hws[0])
|
||||||
#define gst_frame_prevsize(s) ((s - 2)->data.hws[1])
|
#define gst_frame_prevsize(s) ((s - 2)->data.hws[1])
|
||||||
#define gst_frame_errloc(s) ((s - 2)->data.hws[2])
|
#define gst_frame_errloc(s) ((s - 2)->data.hws[2])
|
||||||
#define gst_frame_ret(s) ((s - 2)->data.hws[3])
|
#define gst_frame_ret(s) ((s - 2)->data.hws[3])
|
||||||
|
172
vm.c
172
vm.c
@ -54,7 +54,7 @@ static void gst_load(Gst *vm, GstValue callee) {
|
|||||||
gst_frame_pc(stack) = pc;
|
gst_frame_pc(stack) = pc;
|
||||||
/* Nil arguments */
|
/* Nil arguments */
|
||||||
for (i = 0; i < locals; ++i)
|
for (i = 0; i < locals; ++i)
|
||||||
stack[i].type = GST_NIL;
|
stack[i].type = GST_NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Contextual macro to state in function with VM */
|
/* Contextual macro to state in function with VM */
|
||||||
@ -65,7 +65,7 @@ static void gst_load(Gst *vm, GstValue callee) {
|
|||||||
|
|
||||||
/* Write local state back to VM */
|
/* Write local state back to VM */
|
||||||
#define GST_STATE_WRITE() do { \
|
#define GST_STATE_WRITE() do { \
|
||||||
*vm->thread = thread; \
|
*vm->thread = thread; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Start running the VM from where it left off. Continue running
|
/* Start running the VM from where it left off. Continue running
|
||||||
@ -77,8 +77,8 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
GstValue temp, v1, v2;
|
GstValue temp, v1, v2;
|
||||||
uint16_t *pc;
|
uint16_t *pc;
|
||||||
|
|
||||||
/* Intialize local state */
|
/* Intialize local state */
|
||||||
GST_STATE_SYNC();
|
GST_STATE_SYNC();
|
||||||
pc = gst_frame_pc(stack);
|
pc = gst_frame_pc(stack);
|
||||||
|
|
||||||
/* Main interpreter loop */
|
/* Main interpreter loop */
|
||||||
@ -87,7 +87,7 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
switch (*pc) {
|
switch (*pc) {
|
||||||
|
|
||||||
default:
|
default:
|
||||||
gst_error(vm, "unknown opcode");
|
gst_error(vm, "unknown opcode");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#define OP_BINARY_MATH(op) \
|
#define OP_BINARY_MATH(op) \
|
||||||
@ -122,23 +122,23 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
pc += 3;
|
pc += 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_NEG: /* Unary negation */
|
case GST_OP_NEG: /* Unary negation */
|
||||||
v1 = stack[pc[2]];
|
v1 = stack[pc[2]];
|
||||||
gst_assert(vm, v1.type == GST_NUMBER, GST_EXPECTED_NUMBER_LOP);
|
gst_assert(vm, v1.type == GST_NUMBER, GST_EXPECTED_NUMBER_LOP);
|
||||||
temp.type = GST_NUMBER;
|
temp.type = GST_NUMBER;
|
||||||
temp.data.number = -v1.data.number;
|
temp.data.number = -v1.data.number;
|
||||||
stack[pc[1]] = temp;
|
stack[pc[1]] = temp;
|
||||||
pc += 3;
|
pc += 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_INV: /* Unary multiplicative inverse */
|
case GST_OP_INV: /* Unary multiplicative inverse */
|
||||||
v1 = stack[pc[2]];
|
v1 = stack[pc[2]];
|
||||||
gst_assert(vm, v1.type == GST_NUMBER, GST_EXPECTED_NUMBER_LOP);
|
gst_assert(vm, v1.type == GST_NUMBER, GST_EXPECTED_NUMBER_LOP);
|
||||||
temp.type = GST_NUMBER;
|
temp.type = GST_NUMBER;
|
||||||
temp.data.number = 1 / v1.data.number;
|
temp.data.number = 1 / v1.data.number;
|
||||||
stack[pc[1]] = temp;
|
stack[pc[1]] = temp;
|
||||||
pc += 3;
|
pc += 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_FLS: /* Load False */
|
case GST_OP_FLS: /* Load False */
|
||||||
temp.type = GST_BOOLEAN;
|
temp.type = GST_BOOLEAN;
|
||||||
@ -211,7 +211,7 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_CST: /* Load constant value */
|
case GST_OP_CST: /* Load constant value */
|
||||||
v1 = gst_frame_callee(stack);
|
v1 = gst_frame_callee(stack);
|
||||||
gst_assert(vm, v1.type == GST_FUNCTION, GST_EXPECTED_FUNCTION);
|
gst_assert(vm, v1.type == GST_FUNCTION, GST_EXPECTED_FUNCTION);
|
||||||
if (pc[2] > v1.data.function->def->literalsLen)
|
if (pc[2] > v1.data.function->def->literalsLen)
|
||||||
gst_error(vm, GST_NO_UPVALUE);
|
gst_error(vm, GST_NO_UPVALUE);
|
||||||
@ -336,40 +336,40 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_GET: /* Associative get */
|
case GST_OP_GET: /* Associative get */
|
||||||
{
|
{
|
||||||
const char *err;
|
const char *err;
|
||||||
err = gst_get(stack[pc[2]], stack[pc[3]], stack + pc[1]);
|
err = gst_get(stack[pc[2]], stack[pc[3]], stack + pc[1]);
|
||||||
if (err != NULL)
|
if (err != NULL)
|
||||||
gst_error(vm, err);
|
gst_error(vm, err);
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case GST_OP_SET: /* Associative set */
|
case GST_OP_SET: /* Associative set */
|
||||||
{
|
{
|
||||||
const char *err;
|
const char *err;
|
||||||
err = gst_set(vm, stack[pc[1]], stack[pc[2]], stack[pc[3]]);
|
err = gst_set(vm, stack[pc[1]], stack[pc[2]], stack[pc[3]]);
|
||||||
if (err != NULL)
|
if (err != NULL)
|
||||||
gst_error(vm, err);
|
gst_error(vm, err);
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case GST_OP_ERR: /* Throw error */
|
case GST_OP_ERR: /* Throw error */
|
||||||
vm->ret = stack[pc[1]];
|
vm->ret = stack[pc[1]];
|
||||||
goto vm_error;
|
goto vm_error;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_TRY: /* Begin try block */
|
case GST_OP_TRY: /* Begin try block */
|
||||||
gst_frame_errloc(stack) = pc[1];
|
gst_frame_errloc(stack) = pc[1];
|
||||||
gst_frame_errjmp(stack) = pc + *(uint32_t *)(pc + 2);
|
gst_frame_errjmp(stack) = pc + *(uint32_t *)(pc + 2);
|
||||||
pc += 4;
|
pc += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_UTY: /* End try block */
|
case GST_OP_UTY: /* End try block */
|
||||||
gst_frame_errjmp(stack) = NULL;
|
gst_frame_errjmp(stack) = NULL;
|
||||||
pc++;
|
pc++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_RTN: /* Return nil */
|
case GST_OP_RTN: /* Return nil */
|
||||||
vm->ret.type = GST_NIL;
|
vm->ret.type = GST_NIL;
|
||||||
@ -377,10 +377,10 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
|
|
||||||
case GST_OP_RET: /* Return */
|
case GST_OP_RET: /* Return */
|
||||||
vm->ret = stack[pc[1]];
|
vm->ret = stack[pc[1]];
|
||||||
goto ret;
|
goto ret;
|
||||||
|
|
||||||
case GST_OP_PSH: /* Push stack frame */
|
case GST_OP_PSH: /* Push stack frame */
|
||||||
{
|
{
|
||||||
GstValue *nextStack;
|
GstValue *nextStack;
|
||||||
uint32_t expectedArity, normalArity, arity, varArgs, i, locals, nextCount;
|
uint32_t expectedArity, normalArity, arity, varArgs, i, locals, nextCount;
|
||||||
|
|
||||||
@ -439,34 +439,34 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
if (varArgs) {
|
if (varArgs) {
|
||||||
GstValue *tuple;
|
GstValue *tuple;
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
tuple = gst_tuple(vm, arity - expectedArity);
|
tuple = gst_tuple(vm, arity - expectedArity);
|
||||||
for (j = expectedArity; j < arity; ++j)
|
for (j = expectedArity; j < arity; ++j)
|
||||||
tuple[j - expectedArity] = stack[pc[3 + j]];
|
tuple[j - expectedArity] = stack[pc[3 + j]];
|
||||||
nextStack[expectedArity].type = GST_TUPLE;
|
nextStack[expectedArity].type = GST_TUPLE;
|
||||||
nextStack[expectedArity].data.tuple = tuple;
|
nextStack[expectedArity].data.tuple = tuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Increment pc */
|
/* Increment pc */
|
||||||
pc += 3 + arity;
|
pc += 3 + arity;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_OP_CAL: /* Call */
|
case GST_OP_CAL: /* Call */
|
||||||
case GST_OP_TCL: /* Tail call */
|
case GST_OP_TCL: /* Tail call */
|
||||||
if (pc[0] == GST_OP_CAL) {
|
if (pc[0] == GST_OP_CAL) {
|
||||||
gst_frame_ret(stack) = pc[1];
|
gst_frame_ret(stack) = pc[1];
|
||||||
gst_frame_pc(stack) = pc + 2;
|
gst_frame_pc(stack) = pc + 2;
|
||||||
thread.count += gst_frame_size(stack) + GST_FRAME_SIZE;
|
thread.count += gst_frame_size(stack) + GST_FRAME_SIZE;
|
||||||
stack = thread.data + thread.count;
|
stack = thread.data + thread.count;
|
||||||
} else {
|
} else {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
GstValue *nextStack = stack + gst_frame_size(stack) + GST_FRAME_SIZE;
|
GstValue *nextStack = stack + gst_frame_size(stack) + GST_FRAME_SIZE;
|
||||||
uint32_t nextSize = gst_frame_size(nextStack);
|
uint32_t nextSize = gst_frame_size(nextStack);
|
||||||
/* Check for closures */
|
/* Check for closures */
|
||||||
if (gst_frame_env(stack) != NULL) {
|
if (gst_frame_env(stack) != NULL) {
|
||||||
gst_frame_env(stack)->thread = NULL;
|
gst_frame_env(stack)->thread = NULL;
|
||||||
gst_frame_env(stack)->stackOffset = gst_frame_size(stack);
|
gst_frame_env(stack)->stackOffset = gst_frame_size(stack);
|
||||||
gst_frame_env(stack)->values = gst_alloc(vm, sizeof(GstValue) * gst_frame_size(stack));
|
gst_frame_env(stack)->values = gst_alloc(vm, sizeof(GstValue) * gst_frame_size(stack));
|
||||||
gst_memcpy(gst_frame_env(stack)->values,
|
gst_memcpy(gst_frame_env(stack)->values,
|
||||||
thread.data + thread.count,
|
thread.data + thread.count,
|
||||||
gst_frame_size(stack) * sizeof(GstValue));
|
gst_frame_size(stack) * sizeof(GstValue));
|
||||||
@ -477,8 +477,8 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
gst_frame_env(stack) = NULL;
|
gst_frame_env(stack) = NULL;
|
||||||
gst_frame_errjmp(stack) = NULL;
|
gst_frame_errjmp(stack) = NULL;
|
||||||
/* Replace current stack frame with next */
|
/* Replace current stack frame with next */
|
||||||
for (i = 0; i < nextSize; ++i)
|
for (i = 0; i < nextSize; ++i)
|
||||||
stack[i] = nextStack[i];
|
stack[i] = nextStack[i];
|
||||||
}
|
}
|
||||||
v1 = gst_frame_callee(stack);
|
v1 = gst_frame_callee(stack);
|
||||||
if (v1.type == GST_FUNCTION) {
|
if (v1.type == GST_FUNCTION) {
|
||||||
@ -486,7 +486,7 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
} else if (v1.type == GST_CFUNCTION) {
|
} else if (v1.type == GST_CFUNCTION) {
|
||||||
int status;
|
int status;
|
||||||
GST_STATE_WRITE();
|
GST_STATE_WRITE();
|
||||||
status = v1.data.cfunction(vm);
|
status = v1.data.cfunction(vm);
|
||||||
GST_STATE_SYNC();
|
GST_STATE_SYNC();
|
||||||
if (status == GST_RETURN_OK)
|
if (status == GST_RETURN_OK)
|
||||||
goto ret;
|
goto ret;
|
||||||
@ -500,9 +500,9 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
/* Macro for popping stack frame */
|
/* Macro for popping stack frame */
|
||||||
#define pop_frame(onUnderflow) do { \
|
#define pop_frame(onUnderflow) do { \
|
||||||
if (gst_frame_env(stack) != NULL) { \
|
if (gst_frame_env(stack) != NULL) { \
|
||||||
gst_frame_env(stack)->thread = NULL; \
|
gst_frame_env(stack)->thread = NULL; \
|
||||||
gst_frame_env(stack)->stackOffset = gst_frame_size(stack); \
|
gst_frame_env(stack)->stackOffset = gst_frame_size(stack); \
|
||||||
gst_frame_env(stack)->values = gst_alloc(vm, sizeof(GstValue) * gst_frame_size(stack)); \
|
gst_frame_env(stack)->values = gst_alloc(vm, sizeof(GstValue) * gst_frame_size(stack)); \
|
||||||
gst_memcpy(gst_frame_env(stack)->values, \
|
gst_memcpy(gst_frame_env(stack)->values, \
|
||||||
thread.data + thread.count, \
|
thread.data + thread.count, \
|
||||||
gst_frame_size(stack) * sizeof(GstValue)); \
|
gst_frame_size(stack) * sizeof(GstValue)); \
|
||||||
@ -518,7 +518,7 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
/* Label for return */
|
/* Label for return */
|
||||||
ret:
|
ret:
|
||||||
/* Check for closure */
|
/* Check for closure */
|
||||||
pop_frame(GST_RETURN_OK);
|
pop_frame(GST_RETURN_OK);
|
||||||
pc = gst_frame_pc(stack);
|
pc = gst_frame_pc(stack);
|
||||||
stack[gst_frame_ret(stack)] = vm->ret;
|
stack[gst_frame_ret(stack)] = vm->ret;
|
||||||
break;
|
break;
|
||||||
@ -526,7 +526,7 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
/* Handle errors from c functions and vm opcodes */
|
/* Handle errors from c functions and vm opcodes */
|
||||||
vm_error:
|
vm_error:
|
||||||
while (gst_frame_errjmp(stack) == NULL)
|
while (gst_frame_errjmp(stack) == NULL)
|
||||||
pop_frame(GST_RETURN_ERROR);
|
pop_frame(GST_RETURN_ERROR);
|
||||||
pc = gst_frame_errjmp(stack);
|
pc = gst_frame_errjmp(stack);
|
||||||
stack[gst_frame_errloc(stack)] = vm->ret;
|
stack[gst_frame_errloc(stack)] = vm->ret;
|
||||||
break;
|
break;
|
||||||
@ -546,13 +546,13 @@ static int gst_continue_size(Gst *vm, uint32_t stackBase) {
|
|||||||
|
|
||||||
/* Continue running the VM after it has stopped */
|
/* Continue running the VM after it has stopped */
|
||||||
int gst_continue(Gst *vm) {
|
int gst_continue(Gst *vm) {
|
||||||
return gst_continue_size(vm, vm->thread->count);
|
return gst_continue_size(vm, vm->thread->count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run the vm with a given function */
|
/* Run the vm with a given function */
|
||||||
int gst_run(Gst *vm, GstValue func) {
|
int gst_run(Gst *vm, GstValue func) {
|
||||||
gst_load(vm, func);
|
gst_load(vm, func);
|
||||||
return gst_continue(vm);
|
return gst_continue(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Raw function call implementation for use from c code. Beware code
|
/* Raw function call implementation for use from c code. Beware code
|
||||||
@ -595,8 +595,8 @@ int gst_call(Gst *vm, GstValue callee, uint32_t arity, GstValue *args) {
|
|||||||
thread.capacity = newCap;
|
thread.capacity = newCap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save modified thread object */
|
/* Save modified thread object */
|
||||||
thread.count = nextCount;
|
thread.count = nextCount;
|
||||||
*vm->thread = thread;
|
*vm->thread = thread;
|
||||||
|
|
||||||
/* Set up the new stack frame */
|
/* Set up the new stack frame */
|
||||||
@ -620,11 +620,11 @@ int gst_call(Gst *vm, GstValue callee, uint32_t arity, GstValue *args) {
|
|||||||
if (varArgs) {
|
if (varArgs) {
|
||||||
GstValue *tuple;
|
GstValue *tuple;
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
tuple = gst_tuple(vm, arity - expectedArity);
|
tuple = gst_tuple(vm, arity - expectedArity);
|
||||||
for (j = expectedArity; j < arity; ++j)
|
for (j = expectedArity; j < arity; ++j)
|
||||||
tuple[j - expectedArity] = args[j];
|
tuple[j - expectedArity] = args[j];
|
||||||
stack[expectedArity].type = GST_TUPLE;
|
stack[expectedArity].type = GST_TUPLE;
|
||||||
stack[expectedArity].data.tuple = tuple;
|
stack[expectedArity].data.tuple = tuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call the function */
|
/* Call the function */
|
||||||
@ -635,9 +635,9 @@ int gst_call(Gst *vm, GstValue callee, uint32_t arity, GstValue *args) {
|
|||||||
GST_STATE_SYNC();
|
GST_STATE_SYNC();
|
||||||
/* Check for closures */
|
/* Check for closures */
|
||||||
if (gst_frame_env(stack) != NULL) {
|
if (gst_frame_env(stack) != NULL) {
|
||||||
gst_frame_env(stack)->thread = NULL;
|
gst_frame_env(stack)->thread = NULL;
|
||||||
gst_frame_env(stack)->stackOffset = gst_frame_size(stack);
|
gst_frame_env(stack)->stackOffset = gst_frame_size(stack);
|
||||||
gst_frame_env(stack)->values = gst_alloc(vm, sizeof(GstValue) * gst_frame_size(stack));
|
gst_frame_env(stack)->values = gst_alloc(vm, sizeof(GstValue) * gst_frame_size(stack));
|
||||||
gst_memcpy(gst_frame_env(stack)->values,
|
gst_memcpy(gst_frame_env(stack)->values,
|
||||||
thread.data + thread.count,
|
thread.data + thread.count,
|
||||||
gst_frame_size(stack) * sizeof(GstValue));
|
gst_frame_size(stack) * sizeof(GstValue));
|
||||||
@ -652,9 +652,9 @@ GstValue gst_arg(Gst *vm, uint16_t index) {
|
|||||||
GstValue *stack = vm->thread->data + vm->thread->count;
|
GstValue *stack = vm->thread->data + vm->thread->count;
|
||||||
uint16_t frameSize = gst_frame_size(stack);
|
uint16_t frameSize = gst_frame_size(stack);
|
||||||
if (frameSize <= index) {
|
if (frameSize <= index) {
|
||||||
GstValue ret;
|
GstValue ret;
|
||||||
ret.type = GST_NIL;
|
ret.type = GST_NIL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return stack[index];
|
return stack[index];
|
||||||
}
|
}
|
||||||
@ -663,7 +663,7 @@ GstValue gst_arg(Gst *vm, uint16_t index) {
|
|||||||
void gst_set_arg(Gst* vm, uint16_t index, GstValue x) {
|
void gst_set_arg(Gst* vm, uint16_t index, GstValue x) {
|
||||||
GstValue *stack = vm->thread->data + vm->thread->count;
|
GstValue *stack = vm->thread->data + vm->thread->count;
|
||||||
uint16_t frameSize = gst_frame_size(stack);
|
uint16_t frameSize = gst_frame_size(stack);
|
||||||
if (frameSize <= index) return;
|
if (frameSize <= index) return;
|
||||||
stack[index] = x;
|
stack[index] = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user