void SignatureBuilder::writeArg(gc<Expr> expr) { // If it's a record, destructure it into the signature. RecordExpr* record = expr->asRecordExpr(); if (record != NULL) { for (int i = 0; i < record->fields().count(); i++) { add(record->fields()[i].name); add(":"); } return; } // Right now, all other exprs mean "some arg goes here". add("0:"); }
int ExprCompiler::compileArg(gc<Expr> arg) { // No arg so do nothing. if (arg.isNull()) return 0; RecordExpr* record = arg->asRecordExpr(); if (record != NULL) { // Compile each field. for (int i = 0; i < record->fields().count(); i++) { compile(record->fields()[i].value, makeTemp()); } return record->fields().count(); } // If we got here, the arg isn't a record, so its a single value. compile(arg, makeTemp()); return 1; }