Skip to content

Commit

Permalink
Fixed handling of @ in lvalue context; fixes JoeStrout#5.
Browse files Browse the repository at this point in the history
Also, added some preliminary work on shortening list/map references when printing other lists/maps.
  • Loading branch information
JoeStrout committed Jul 3, 2019
1 parent 5ae238c commit e642dba
Show file tree
Hide file tree
Showing 30 changed files with 195 additions and 134 deletions.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/LICENSE
100644 → 100755
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/complete.c
100644 → 100755
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/editline.c
100644 → 100755
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/editline.h
100644 → 100755
Empty file.
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/os9.h
100644 → 100755
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/sysos9.c
100644 → 100755
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/sysunix.c
100644 → 100755
Empty file.
Empty file modified MiniScript-cpp/MiniScript.xcodeproj/editline/unix.h
100644 → 100755
Empty file.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "src/MiniScript/MiniscriptParser.cpp"
timestampString = "582159837.856138"
timestampString = "583885931.80223"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "168"
Expand All @@ -42,11 +42,11 @@
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "src/MiniScript/MiniscriptParser.cpp"
timestampString = "582159837.856488"
timestampString = "583885931.802286"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "393"
endingLineNumber = "393"
startingLineNumber = "385"
endingLineNumber = "385"
landmarkName = "Parser::ParseFunction(Lexer tokens, bool asLval, bool statementStart)"
landmarkType = "7">
</BreakpointContent>
Expand Down Expand Up @@ -90,7 +90,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.748728"
timestampString = "583885932.176335"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -105,7 +105,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.751506"
timestampString = "583885932.178982"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -120,7 +120,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.7545151"
timestampString = "583885932.182005"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -135,7 +135,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.757347"
timestampString = "583885932.184875"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -150,7 +150,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.75968"
timestampString = "583885932.188185"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -165,7 +165,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.761667"
timestampString = "583885932.190881"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -180,7 +180,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.763647"
timestampString = "583885932.193647"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -195,7 +195,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.765668"
timestampString = "583885932.196457"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -210,7 +210,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.767589"
timestampString = "583885932.199342"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -225,7 +225,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.769821"
timestampString = "583885932.202333"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -240,7 +240,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.7722"
timestampString = "583885932.205367"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand All @@ -255,7 +255,7 @@
moduleName = "MiniScript"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/jstrout/Documents/svnrepo/stroutandsons/MiniScript/MiniScript-cpp/src/MiniScript/SimpleVector.h"
timestampString = "582586695.77468"
timestampString = "583885932.208632"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "193"
Expand Down
2 changes: 1 addition & 1 deletion MiniScript-cpp/src/MiniScript/MiniscriptInterpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ namespace MiniScript {
}
if (implicitOutput and globalContext->implicitResultCounter > startImpResultCount) {
Value result = globalContext->GetVar("_");
if (!result.IsNull()) (*implicitOutput)(result.ToString());
if (!result.IsNull()) (*implicitOutput)(result.ToString(vm));
}
}

Expand Down
45 changes: 21 additions & 24 deletions MiniScript-cpp/src/MiniScript/MiniscriptParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -326,29 +326,21 @@ namespace MiniScript {
lhs = expr;
rhs = ParseExpr(tokens);
} else {
if (allowExtra && false) {
// We're allowing extra stuff after the expression or statement,
// because we're in the middle of a single-line if. So, do
// the implicit assignment as if we hit an EOL.
rhs = FullyEvaluate(expr);
output->Add(TACLine(TACLine::Op::AssignImplicit, rhs));
} else {
// This looks like a command statement. Parse the rest
// of the line as arguments to a function call.
Value funcRef = expr;
int argCount = 0;
while (true) {
Value arg = ParseExpr(tokens);
output->Add(TACLine(TACLine::Op::PushParam, arg));
argCount++;
if (tokens.Peek().type == Token::Type::EOL) break;
if (tokens.Peek().type == Token::Type::Keyword || tokens.Peek().text == "else") break;
if (RequireEitherToken(tokens, Token::Type::Comma, Token::Type::EOL).type == Token::Type::EOL) break;
}
Value result = Value::Temp(output->nextTempNum++);
output->Add(TACLine(result, TACLine::Op::CallFunctionA, funcRef, Value(argCount)));
output->Add(TACLine(TACLine::Op::AssignImplicit, result));
// This looks like a command statement. Parse the rest
// of the line as arguments to a function call.
Value funcRef = expr;
int argCount = 0;
while (true) {
Value arg = ParseExpr(tokens);
output->Add(TACLine(TACLine::Op::PushParam, arg));
argCount++;
if (tokens.Peek().type == Token::Type::EOL) break;
if (tokens.Peek().type == Token::Type::Keyword || tokens.Peek().text == "else") break;
if (RequireEitherToken(tokens, Token::Type::Comma, Token::Type::EOL).type == Token::Type::EOL) break;
}
Value result = Value::Temp(output->nextTempNum++);
output->Add(TACLine(result, TACLine::Op::CallFunctionA, funcRef, Value(argCount)));
output->Add(TACLine(TACLine::Op::AssignImplicit, result));
return;
}

Expand Down Expand Up @@ -539,7 +531,7 @@ namespace MiniScript {
bool firstComparison = true;
while (opcode != TACLine::Op::Noop) {
tokens.Dequeue(); // discard the operator (we have the opcode)
//opA = FullyEvaluate(opA);
opA = FullyEvaluate(opA);

Value opB = (*this.*nextLevel)(tokens, false, false);
int tempNum = output->nextTempNum++;
Expand Down Expand Up @@ -643,6 +635,7 @@ namespace MiniScript {
if (tokens.Peek().type != Token::Type::AddressOf) return (*this.*nextLevel)(tokens, asLval, statementStart);
tokens.Dequeue();
Value val = (*this.*nextLevel)(tokens, true, statementStart);
val.noInvoke = true;
return val;
}

Expand Down Expand Up @@ -721,7 +714,7 @@ namespace MiniScript {
}

RequireToken(tokens, Token::Type::RSquare);
} else if (val.type == ValueType::Var or val.type == ValueType::SeqElem) {
} else if ((val.type == ValueType::Var or val.type == ValueType::SeqElem) && !val.noInvoke) {
// Got a variable... it might refer to a function!
if (not asLval or (tokens.Peek().type == Token::Type::LParen && !tokens.Peek().afterSpace)) {
// If followed by parens, definitely a function call, possibly with arguments!
Expand Down Expand Up @@ -885,6 +878,8 @@ namespace MiniScript {
}

Value Parser::FullyEvaluate(Value val) {
// If var was protected with @, then return it as-is; don't attempt to call it.
if (val.noInvoke) return val;
if (val.type == ValueType::Var) {
// Don't invoke super; leave as-is so we can do special handling
// of it at runtime. Also, as an optimization, same for "self".
Expand Down Expand Up @@ -973,6 +968,8 @@ namespace MiniScript {
ErrorIf(list[0].nextTempNum != 12);
ErrorIf(&foo != &bar);

TestValidParse("pi < 4");
TestValidParse("(pi < 4)");
TestValidParse("if true then 20 else 30");
TestValidParse("f = function(x)\nreturn x*3\nend function\nf(14)");
TestValidParse("foo=\"bar\"\nindexes(foo*2)\nfoo.indexes");
Expand Down
13 changes: 12 additions & 1 deletion MiniScript-cpp/src/MiniScript/MiniscriptTAC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ namespace MiniScript {
String extraStr = sA.Substring(0, extraChars);
size_t totalBytes = lenB * repeats + extraStr.LengthB();
if (totalBytes > Value::maxStringSize) throw LimitExceededException("string too large");
char *buf = new char[totalBytes + 1];
char *buf = new char[totalBytes];
if (buf == NULL) return Value::null;
char *ptr = buf;
for (int i = 0; i < repeats; i++) {
Expand Down Expand Up @@ -661,6 +661,17 @@ namespace MiniScript {
context->StoreValue(storage, result);
}

String Machine::FindShortName(const Value& val) {
String nullStr;
if (stack.Count() < 1) return nullStr;
Context *globalContext = stack[0];
if (globalContext == NULL) return nullStr;
for (ValueDictIterator kv = globalContext->variables.GetIterator(); !kv.Done(); kv.Next()) {
if (kv.Value() == val && kv.Key() != val) return kv.Key().ToString();
}
return nullStr;
}

double Machine::CurrentWallClockTime() {
struct timeval timecheck;
gettimeofday(&timecheck, NULL);
Expand Down
3 changes: 2 additions & 1 deletion MiniScript-cpp/src/MiniScript/MiniscriptTAC.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,8 @@ namespace MiniScript {

Context* GetGlobalContext() { return stack[0]; }
Context* GetTopContext() { return stack.Last(); }

String FindShortName(const Value& val);

double RunTime() { return startTime == 0 ? 0 : CurrentWallClockTime() - startTime; }

TextOutputMethod standardOutput;
Expand Down
Loading

0 comments on commit e642dba

Please sign in to comment.